Запросить пароль sudo и программно повысить привилегии в bash-скрипте?

49

В настоящее время я работаю над сценарием bash, который устанавливает и настраивает различные программы в стандартной системе Linux (в настоящее время - Ubuntu). Поскольку он устанавливает программы и копирует несколько файлов в различные папки, требующие повышенных привилегий, я уже выполнил стандартный «Мне нужны повышенные привилегии» -and-exit.

Однако я хотел бы, если возможно, иметь возможность запрашивать у пользователя пароль sudo и автоматически повышать привилегии сценария, если пользователь не запускает команду сценария с sudo (например, запускает ее из файлового менеджера GUI), без пользователя, чтобы перезапустить скрипт.

Так как он предназначен для запуска на стандартных установках Linux, любой вариант, который модифицирует систему, не будет работать для моих целей. Все параметры должны быть включены в сам скрипт.

Возможно ли это в Bash? Если так, каков наилучший (безопасный, но лаконичный) способ сделать это?

Shauna
источник
@MichaelMrozek - О, радость от того, что у вас так много нишевых сайтов, и при этом стараются минимизировать фрагментацию И вы знаете, ссылка, которую вы дали, ни разу не появлялась у меня при поиске в Google.
Шона
@jww вы понимаете, что почти все эти ссылки были заданы через 4 года после этого, верно?
Шона
1
@Shauna - Полагаю, вы уже решили проблему. Ссылки для будущих посетителей.

Ответы:

64

Я запускаю sudoпрямо из скрипта:

if [ $EUID != 0 ]; then
    sudo "$0" "$@"
    exit $?
fi
Михаил Мрозек
источник
16

Я предлагаю:

#!/bin/bash

if (($EUID != 0)); then
  if [[ -t 1 ]]; then
    sudo "$0" "$@"
  else
    exec 1>output_file
    gksu "$0 $@"
  fi
  exit
fi

# some example stuff
ls -l /root
echo "app: $0"
for f; do
  echo ">$f<"
done
enzotib
источник
Что if [[ -t 1 ]];проверяет?
Шона
Ах хорошо. Я подумал, что это как-то связано с терминалом против GUI, но не был уверен, что проверяет сам оператор if.
Шона
Удивительно, спасибо!
Fire-Dragon-DoL
16

Добавьте это в качестве первой строки скрипта:

[ "$UID" -eq 0 ] || exec sudo bash "$0" "$@"

Изменение sudoк gksuили , gksudoесли вы предпочитаете графическую подсказку.

Kevin
источник
3
Обратите внимание, что "$*"это объединит все аргументы в один ( /path/to/script one two threeприведет к тому, $1что они будут one two three), и $*без кавычек испортит пробелы в аргументах. "$@"работает правильно
Михаил Мрозек
@MichaelMrozek Ах, да. Это то, что я искал, Исправлено
Кевин
Есть ли способ сделать это в Debian, где, кажется, нет команды sudo?
неправильное имя
@wrongusername установить sudo, это гораздо лучше, чем использовать su. Но если ты действительно хочешь, наверноеexec su -c "$0" "$@"
Кевин
2

пример сценария, которым я не против поделиться ::

#!/bin/bash
[ "$UID" -eq 0 ] || exec sudo "$0" "$@" && echo -n "sudo bash what: "
read WHAT
sudo $WHAT

--ImP.TeK

ImPerial TeK. Решения
источник
[ "$UID" -eq 0 ] || exec sudo "$0" "$@"- Похоже, действительно эффективный лайнер! Приятно!
groovenectar
Имеет ли смысл использовать здесь Effective UID $EUDIили всегда один и тот же результат? Например,[[ "$EUID" -eq 0 ]] || exec sudo "$0" "$@"
groovenectar