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

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

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

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

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

3 ответа

Решение

Использовать 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

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

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

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

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

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

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

Ответ, в котором упоминается установка хоста, смутил меня, так как я хочу, чтобы пользователь sudo мог запускать привилегированные команды, не требуя учитывать такой «аспект хоста»; любой хост должен работать, поэтому я использую специальныйALLзарезервированное слово.

Предположим, вы хотите, чтобы все пользователи sudo (т. е. пользователи Unix, входящие в группу sudo Unix ) выполняли следующие команды от имени суперпользователя ( root ) без необходимости вводить свои пароли:

Сначала узнайте полный путь к исполняемому файлу, используяwhich:

  • which iftop>/usr/sbin/iftop
  • which dbus-monitor>/usr/bin/dbus-monitor

Предполагая, что основной файл конфигурации sudoetc/sudoersсодержит следующую директиву (по умолчанию в Ubuntu)...

      #includedir /etc/sudoers.d

... тогда рекомендуется добавить вашу конфигурацию в отдельный файл в каталоге, например/etc/sudoers.d/customizations. Таким образом, вы не столкнетесь с проблемами, когда обновление исходного пакета sudo захочет изменить исходный/etc/sudoersфайл, и менеджер пакетов заметит конфликтующие изменения, сделанные вами.

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

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

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

Теперь добавьте в этот файл следующие строки и сохраните его:

      %sudo ALL=NOPASSWD: /usr/sbin/iftop
%sudo ALL=NOPASSWD: /usr/bin/dbus-monitor --system

The %sudoв начале этих строк указываются правила для всех членов группы ("%") судо .

Изменения в файлах конфигурации sudo, включая новые файлы в/etc/sudoers.d/каталог, вступают в силу немедленно — «перезагрузка» sudo не требуется.

Теперь обратите внимание, что происходит при выполнении следующих команд: (в целях тестирования любой текущий билет sudo, т. е. промежуток времени, не требующий повторного ввода пароля, может быть напрямую отозван/истечен по времени, выполнив sudo -k)

  • iftop: не работает сYou don't have permission to capture on that device (socket: Operation not permitted). Это связано с тем, что запуск сконфигурированных команд безsudoпрефикс ведет себя непривилегированно, как обычно.
  • sudo iftop: эта команда теперь будет успешно выполняться без запроса пароля.
  • sudo iftop -Bотобразить пропускную способность в байтах »): эта команда также будет успешно выполняться без запроса пароля, потому что, как объясняется, « простое имя файла [без параметров в файле конфигурации] позволяет пользователю запускать команду с любыми аргументами, которые они желание. "
  • sudo dbus-monitor: система запросит пароль, потому что, как объясняется, « если [команда в файле конфигурации] имеет связанные аргументы командной строки, то аргументы в [команде] должны точно совпадать с аргументами, заданными пользователем в командной строке. (или сопоставьте подстановочные знаки, если они есть) » .
  • sudo dbus-monitor --system: эта команда теперь будет успешно выполняться без запроса пароля.
  • sudo dbus-monitor --system --foo: система запросит пароль, так как аргументы не соответствуют конфигурации.

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

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

... создайте файл конфигурации sudo со следующим содержимым (при условии, что стандартные расположения Ubuntu для исполняемых файловrebootиshutdown):

      %sudo ALL=NOPASSWD: /usr/sbin/reboot
%sudo ALL=NOPASSWD: /usr/sbin/shutdown -r now
%sudo ALL=NOPASSWD: /usr/sbin/shutdown -P now

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

      %sudo ALL=NOPASSWD: /usr/sbin/reboot ""

... потому что какman sudoersобъясняет: « вы можете указать «», чтобы указать, что команда может быть запущена только без аргументов командной строки » .

Другие вопросы по тегам