Скрипт для использования sudo в терминале, иначе gksudo?

1936
Ryan Thompson

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


Ответ

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

#!/bin/sh  SUDO="/usr/bin/sudo"  if [ -t 1 ]; then "$SUDO" "$@"; else gksudo -- "$SUDO" "$@"; fi 

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

0

3 ответа на вопрос

1
Jonathan

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

sudo ./script_name.sh 

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

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

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

I disagree with the statement on security. The author might be confident to wrap a simple portion with sudo, but if he runs the whole script with sudo, then the entire script needs to be inspected and proven free of security errors on every edit. It's safer to just have sudo for the minimal subset of commands. Rich Homolka 14 лет назад 2
1
Doug Harris

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

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

`[-t 1]` похоже работает. Ryan Thompson 14 лет назад 0
Просто обратите внимание, что вы можете перенаправить вывод, используя tee или подобное, и `[-t 1]` вернет true, что не то, что вам нужно. `[-t 0]` кажется более подходящим, так как он проверяет стандартный ввод. domen 11 лет назад 0
0
grawity
if [ "$DISPLAY" ]; then gksudo foo else sudo foo fi 

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

Похожие вопросы