Скрипты Bash, требующие пароля sudo - PullRequest
34 голосов
/ 20 октября 2010

Я создаю скрипт установщика Bash, который компилирует и устанавливает некоторые библиотеки для OSX и Linux.Поскольку некоторые команды в моем скрипте («make install», «apt-get install», «port install» и т. Д.) Требуют sudo, мне нужно, чтобы пользователь указал пароль.

В настоящее время у пользователя запрашивают пароль всякий раз, когда собирается выполнить первую команду sudo, но поскольку это часто происходит после этапа компиляции, всегда есть некоторое время между запуском сценария и необходимостью ввода пароля.

Я бы хотел поставить пароль + проверку в начале скрипта.Также мне любопытно, если это действительно хороший способ установки системных библиотек.

В качестве альтернативы, я мог бы установить библиотеки в локальной папке с песочницей, которая не требует sudo, но тогда я должен сказатьget и macports, где устанавливать их библиотеки, отличные от стандартных / usr / local / и / opt / local, и я не уверен, как это сделать, и не является ли это умной идеей.

Ответы [ 3 ]

66 голосов
/ 20 октября 2010

Чтобы получить пароль, просто поставьте sudo echo "Thanks." в начале скрипта.

Но я бы предпочел это решение:

if [[ $UID != 0 ]]; then
    echo "Please run this script with sudo:"
    echo "sudo $0 $*"
    exit 1
fi
5 голосов
/ 04 февраля 2017

Для тех, кто не хочет повышать весь сценарий (чтобы ограничить риски, используя только sudo в сценарии, где это необходимо), первая часть принятого ответа sudo echo "Thanks" работает, но не отвечает на ошибку пароля sudo выход из сценария. Для этого сценарии, которые включают команды sudo и хотят обеспечить доступ sudo до его использования, могут начинаться с

if [[ ! $(sudo echo 0) ]]; then exit; fi

Предостережение заключается в том, что вы полагаетесь на существование тайм-аута sudoers, который будет длиться в течение всего сценария, чтобы подавить остальные запросы.

1 голос
/ 26 мая 2018

Еще один способ сделать это:

function checkSudo() {
    if ((EUID != 0)); then
        echo "Granting root privileges for script ( $SCRIPT_NAME )"
        if [[ -t 1 ]]; then
            sudo "$0" "$@"
        else
            exec 1>output_file
            gksu "$0" "$@"
        fi
        exit
    fi
}
...