Скрипт для использования sudo в терминале, иначе gksudo?
Я хотел бы написать скрипт, который выполняет задачу администрирования, и я хотел бы иметь возможность запускать его из терминала или нет. Если он запускается в терминале, даже графическом, я бы хотел попросить пароль с помощью sudo. Если он запускается другим способом (например, диалог Alt+F2), он должен использовать gksudo. Любые решения?
Ответ
Исходя из нижеприведенного, вот что я придумал:
#!/bin/sh
SUDO="/usr/bin/sudo"
if [ -t 1 ]; then
"$SUDO" "$@";
else
gksudo -- "$SUDO" "$@";
fi
Немного неуклюжий случай для gksudo состоит в том, чтобы гарантировать, что параметры анализируются sudo, а не gksudo, потому что у них есть различные параметры командной строки.
3 ответа
Изучите вывод env
когда вы бежите из терминала и когда запускается через графический интерфейс. Я предполагаю, что Gnome (или любой другой оконный менеджер, который вы используете) добавляет переменную окружения или две.
Другой вариант - проверить, не связан ли с ним tty, используя if [ -t 1 ]
как показано в этом ответе (обратите внимание на предостережения в комментариях).
Я полагаю, что более распространенный метод состоит в том, чтобы просто заявить, что для выполнения скрипта требуется sudo, например:
sudo ./script_name.sh
Таким образом, весь скрипт запускается с правами администратора. Если вы думаете об этом с точки зрения модели безопасности, то нет причин, по которым скрипт, которому требуется sudo хотя бы для его части, не должен запускаться только с sudo. В противном случае это просто неприятность.
Однако, если вы настаиваете на использовании sudo только для определенных частей, вы можете поместить sudo в ваш настоящий скрипт bash, и он запросит пароль и будет ждать ввода, пока не продолжит выполнение сценария. После получения хотя бы одной записи пароля sudo все последующие sudos сохранят повышенные привилегии и больше не будут запрашивать пароль. Это также оставит вам весь сеанс терминала с повышенными привилегиями для будущего sudo, не выполненного в скрипте.
Что касается gksudo, я думаю, что вариант состоит в том, чтобы сказать индивидууму использовать диалог запуска alt-f2, и вместо того, чтобы вводить sudo script_name.sh, введите gksudo, а затем нажмите кнопку "Выполнить с файлом" и попросите их перейти и выбрать файл сценария, который они должны запустить. Я знаю, это громоздко. Надеюсь, у кого-то есть более элегантное решение.
if [ "$DISPLAY" ]; then
gksudo foo
else
sudo foo
fi
Достаточно близко.