Выдать одну команду отдельным файлом
Отдельный файл видно сразу, его легко убрать, основной /etc/sudoers не меняется.
Требования к файлу: имя без точки и без ~ в конце, владелец root:root, права
0440.
Команда visudo правит /etc/sudoers и файлы /etc/sudoers.d и не даёт сохранить правило с ошибкой в грамматике.
sudo visudo
основной /etc/sudoers
sudo visudo -f /etc/sudoers.d/deploy
отдельный файл правила
sudo EDITOR=vim visudo -f /etc/sudoers.d/deploy
в другом редакторе
sudo chmod 0440 /etc/sudoers.d/deploy
права, которых ждёт sudo
sudo visudo -c
проверить все файлы и их права
sudo visudo -cf /tmp/candidate
проверить готовый файл
sudo -l -U deploy
что в итоге разрешено deploy
sudo пускает пользователей по правилам из /etc/sudoers и файлов каталога
/etc/sudoers.d. Ошибка в этих файлах может оставить машину без sudo, поэтому
их правят через visudo. Он открывает копию файла в редакторе (в Ubuntu по
умолчанию nano, другой — через EDITOR), а после сохранения проверяет
грамматику. Файл с ошибкой он не запишет.
visudo -c проверяет основной файл и все подключённые, вместе с их владельцем и
правами. parsed OK значит только то, что строка написана по грамматике. Что она
разрешает, visudo не оценивает.
Правило читается слева направо:
Часть deploy ALL=(root) NOPASSWD: /usr/bin/systemctl restart app |
Что значит |
|---|---|
deploy |
кому; %группа — всем участникам группы |
ALL= |
на какой машине (почти всегда ALL) |
(root) |
от чьего имени запускать |
NOPASSWD: |
без ввода своего пароля |
/usr/bin/systemctl restart app |
какую команду — полный путь и аргументы |
Полный список — man visudo, грамматика правил — man sudoers.
| Ключ | Что делает | Пример |
|---|---|---|
-c --check |
Только проверить — грамматику, владельца и права всех файлов sudoers. | sudo visudo -c |
-f --file file |
Править или проверить указанный файл вместо /etc/sudoers. | sudo visudo -f /etc/sudoers.d/deploy |
-s --strict |
Строгая проверка — ещё и необъявленные алиасы. | sudo visudo -cs |
-q --quiet |
Не печатать подробности ошибок — с -c в скриптах, где важен код возврата. | sudo visudo -cq |
Ничего не найдено. Попробуй запрос короче.
Отдельный файл видно сразу, его легко убрать, основной /etc/sudoers не меняется.
Требования к файлу: имя без точки и без ~ в конце, владелец root:root, права
0440.
Сначала проверь грамматику, потом смысл: команда в правиле — полный путь (найди его
command -v systemctl), аргументы — ровно те, что нужны. ALL на месте команды
даёт любую команду от root.
-n запрещает вопрос о пароле: где правила нет, sudo сразу печатает
a password is required.
visudo запущен без root. Нужен sudo visudo.
Сохранённый файл не прошёл проверку: visudo печатает файл, номер строки и место
ошибки и спрашивает, что делать. e — вернуться в редактор и исправить, x —
выйти без сохранения. Q сохранит файл с ошибкой — так не делай.
Файл в /etc/sudoers.d создан с обычными правами. Поставь
sudo chmod 0440 файл и повтори sudo visudo -c.
Имя файла содержит точку (deploy.conf) или кончается на ~ — такие файлы sudo
пропускает молча, и visudo -c их не перечисляет. Переименуй без точки.
Из подходящих правил действует последнее. Строка %sudo ALL=(ALL:ALL) ALL или
другой файл ниже по порядку могут перекрыть твоё. Посмотри итог: sudo -l -U имя.
Файлы /etc/sudoers.d читаются в порядке имён — отсюда префиксы 90-.
sudo nano /etc/sudoers сохранит файл с ошибкой, и sudo может перестать
работать. Правь только через visudo и держи открытым второй терминал с
sudo -i, пока не проверишь результат.
NOPASSWD: ALL, звёздочка в аргументах или программа, из которой можно запустить
оболочку (vim, less, find -exec), дают пользователю полный root. Разрешай
конкретную команду с конкретными аргументами.
sudo и членство в ней.sudo.0440.visudo в Ubuntu.EDITOR=vim.Есть неточность? Сообщить об ошибке в статье