Как запустить определенные команды 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
объясняет: « вы можете указать «», чтобы указать, что команда может быть запущена только без аргументов командной строки » .