Как запустить определенные команды sudo без пароля?

211

На одной конкретной машине мне часто приходится запускать sudoкоманды время от времени. Я в порядке ввода пароля sudoв большинстве случаев.

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

  • sudo reboot
  • sudo shutdown -r now
  • sudo shutdown -P now

Как я могу исключить эти команды из защиты паролем sudo?

Бхавеш Диван
источник

Ответы:

283

Используйте NOPASSWDдирективу

Вы можете использовать NOPASSWDдирективу в вашем /etc/sudoersфайле .

Если ваш пользователь вызывается userи ваш хост называется, hostвы можете добавить эти строки в /etc/sudoers:

user host = (root) NOPASSWD: /sbin/shutdown
user host = (root) NOPASSWD: /sbin/reboot

Это позволит пользователю userзапускать нужные команды hostбез ввода пароля. Все остальные sudoкоманды ed по-прежнему требуют пароль.

Команды, указанные в sudoersфайле, должны быть полностью квалифицированы (т. Е. Использовать абсолютный путь к команде для выполнения), как описано на sudoersстранице руководства . Предоставление относительного пути считается синтаксической ошибкой.

Если команда заканчивается завершающим /символом и указывает на каталог, пользователь сможет выполнить любую команду в этом каталоге (но не в каких-либо его подкаталогах). В следующем примере пользователь userможет выполнить любую команду в каталоге /home/someuser/bin/:

user host = (root) NOPASSWD: /home/someuser/bin/

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

Использование /etc/sudoers.dвместо изменения/etc/sudoers

В качестве альтернативы редактированию /etc/sudoersфайла вы можете добавить две строки в новый файл, /etc/sudoers.dнапример /etc/sudoers.d/shutdown. Это элегантный способ разделения различных изменений sudoправ, а также оставление исходного sudoersфайла нетронутым для более простых обновлений.

Примечание. Опять же, вы должны использовать команду visudoдля редактирования файла, чтобы убедиться, что вы не блокируете себя из системы:

sudo visudo -f /etc/sudoers.d/shutdown 

Это также автоматически гарантирует, что владелец и права доступа к новому файлу установлены правильно.

Если sudoersперепутано

Если вы не использовали visudoдля редактирования своих файлов, а затем случайно испортили /etc/sudoersили испортили файл, /etc/sudoers.dто вы будете заблокированы sudo.

Решением может быть исправление файлов, использование pkexecкоторых является альтернативой sudo.

Чтобы исправить /etc/sudoers:

pkexec visudo

Чтобы исправить /etc/sudoers.d/shutdown:

pkexec visudo -f /etc/sudoers.d/shutdown

Если владелец и / или разрешения неверны для какого-либо sudoersфайла, файл будет проигнорирован, sudoтак что вы можете также оказаться заблокированным в этой ситуации. Опять же, вы можете использовать, pkexecчтобы исправить это.

Правильные разрешения должны быть такими:

$ ls -l /etc/sudoers.d/shutdown 
-r--r----- 1 root root 86 Jul 16 15:37 /etc/sudoers.d/shutdown

Используйте pkexecкак это, чтобы исправить владельца и разрешения :

pkexec chown root:root /etc/sudoers.d/shutdown
pkexec chmod 0440 /etc/sudoers.d/shutdown
MGD
источник
2
Две строки относятся конкретно к этим двум командам. Если userдругим способом не предоставлены sudoправа, этот пользователь не может использовать другие команды. Посмотрите на man sudoи man sudoers.
августа
4
@StanKurdziel Я попытался с этой линией на Mac OS X Yosemite , и она работала хорошо: mgd ALL=(root) NOPASSWD: /var/root/test. Я пользователь mgdи имею в ALLвиду "со всех хостов" . /var/root/testэто просто «Hello World» сценарий оболочки с правами доступа: -rwx------ 1 root wheel 27 12 Jun 09:54 /var/root/test. Я не сделал никаких других изменений в системе.
мгг
2
Что находится hostв файле sudoers?
user106563
1
Это не ответ, это почти полное руководство по директиве NOPASSWD. Спасибо.
Эрай
1
@ Майкл, пожалуйста, прочитайте справочную страницу. Там все написано. Процитируем это: Однако вы также можете указать аргументы командной строки (включая символы подстановки). Кроме того, вы можете указать "", чтобы указать, что команда может быть запущена только без аргументов командной строки.
17
3

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

Используя visudo !!

Добавьте следующие строки в конфигурацию:

ALL ALL=NOPASSWD: /sbin/reboot,/sbin/shutdown

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

Пожалуйста, используйте обмен, просто дайте простые краткие ответы.

Сова
источник