Я хотел бы написать скрипт, который выполняет задачу администрирования, и я хотел бы иметь возможность запускать его либо из терминала, либо нет. Если он запускается в терминале, даже графическом, я бы хотел попросить пароль с помощью sudo. Если он запускается другим способом (например, диалог Alt+F2), он должен использовать gksudo. Какие-либо решения?


Ответ

Исходя из нижеприведенного, вот что я придумал:

#!/bin/sh

SUDO="/usr/bin/sudo"

if [ -t 1 ]; then
  "$SUDO" "$@";
else
  gksudo -- "$SUDO" "$@";
fi

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

3 ответа3

1

Я полагаю, что более распространенный метод состоит в том, чтобы просто заявить, что для выполнения скрипта требуется sudo, например:

sudo ./script_name.sh

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

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

Что касается gksudo, я думаю, что вариант состоит в том, чтобы сказать индивидууму использовать диалог запуска alt-f2, и вместо того, чтобы вводить sudo script_name.sh, введите gksudo, а затем нажмите кнопку "Выполнить с файлом" и попросите их перейти и выбрать файл сценария, который они должны запустить. Я знаю, это громоздко. Надеюсь, у кого-то есть более элегантное решение.

1

Изучите вывод env при запуске из терминала и при запуске графическим интерфейсом. Я предполагаю, что Gnome (или любой другой оконный менеджер, который вы используете) добавляет переменную среды или два.

Другой вариант - проверить, не связан ли с ним tty, используя if [ -t 1 ] как показано в этом ответе (обратите внимание на предостережения в комментариях).

0
if [ "$DISPLAY" ]; then
    gksudo foo
else
    sudo foo
fi

Достаточно близко.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .