sudo запускает одну команду от имени другого пользователя — по умолчанию root. Кому и что разрешено, описано в /etc/sudoers и файлах из /etc/sudoers.d/. Пароль спрашивается у того, кто вызывает sudo, а не у root. После ввода он запоминается на несколько минут (в Ubuntu — 15).
Синтаксис
sudo [опции] команда [аргументы…]
sudo -i | -s # оболочка от имени root
sudo -l # что мне разрешено
sudoedit файл # безопасно отредактировать файл от root
visudo [-c] [-f файл] # редактировать или проверить sudoers
От чьего имени и в каком окружении
| Опция | Что делает |
|---|
-u alice | выполнить от имени alice, а не root (можно -u '#1001' по UID) |
-g группа | с указанной основной группой |
-i | оболочка входа целевого пользователя: его окружение, его домашний каталог, его профиль; sudo -i команда — выполнить через эту оболочку |
-s | оболочка от имени root, но в текущем каталоге и без профиля входа |
-E | сохранить все переменные окружения (если политика разрешает) |
--preserve-env=VAR1,VAR2 | сохранить только указанные переменные |
-D каталог | перейти в каталог перед запуском (нужно разрешение runcwd в sudoers) |
-b | запустить команду в фоне |
Пароль и сессия
| Опция | Что делает |
|---|
-n | не спрашивать пароль: если он нужен — сразу ошибка (для скриптов) |
-S | читать пароль со stdin, а не с терминала |
-v | продлить запомненный пароль, ничего не запуская |
-k | забыть пароль: следующий sudo спросит снова |
-K | удалить запомненный пароль полностью и выйти |
Посмотреть права
| Команда | Что показывает |
|---|
sudo -l | твои правила: строки (от_кого) [NOPASSWD:] команды и действующие Defaults |
sudo -l -U alice | правила другого пользователя (нужен root) |
sudo -l команда | разрешена ли конкретная команда: печатает её полный путь или ничего (код 1) |
Правила в sudoers
Строка правила: кто хост=(от_кого:группа) [NOPASSWD:] команды. Хост почти всегда ALL.
| Правило | Значение |
|---|
alice ALL=(ALL:ALL) ALL | alice может всё, с паролем |
%devs ALL=(ALL) ALL | то же для всех участников группы devs (% — группа) |
alice ALL=(ALL) NOPASSWD: ALL | всё и без пароля |
deploy ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx | одна команда ровно с этими аргументами |
alice ALL=(root) /usr/bin/id "" | "" вместо аргументов — команда только без аргументов |
alice ALL=(root) /usr/bin/tail -n * /var/log/* | * в аргументах — шаблон |
alice ALL=(root) /usr/bin/ls, !/usr/bin/ls /root | ! — исключение из разрешённого |
alice ALL=(www-data) /usr/bin/php | только от имени www-data |
alice ALL=(root) sudoedit /etc/hosts | редактировать файл через sudoedit |
Команды пишут полными путями: ls без пути visudo не примет. Узнать путь: command -v systemctl. В Ubuntu уже есть правило %sudo ALL=(ALL:ALL) ALL, поэтому проще всего дать полные права через группу sudo.
Алиасы и Defaults
| Запись | Что делает |
|---|
Cmnd_Alias LOGS = /usr/bin/journalctl, /usr/bin/tail -n * /var/log/* | именованный список команд — потом alice ALL=(root) LOGS |
User_Alias OPS = alice, bob | именованный список пользователей |
Runas_Alias APPS = www-data, postgres | от чьего имени: alice ALL=(APPS) ALL |
Defaults secure_path="…" | PATH для всех команд под sudo |
Defaults:alice timestamp_timeout=5 | сколько минут помнить пароль (для alice); 0 — спрашивать всегда |
Defaults env_keep += "HTTP_PROXY" | какие переменные не сбрасывать |
@includedir /etc/sudoers.d | читать файлы из каталога (уже есть в Ubuntu) |
visudo
| Команда | Что делает |
|---|
visudo | открыть /etc/sudoers в редакторе, проверить синтаксис перед сохранением |
visudo -f /etc/sudoers.d/имя | то же для отдельного файла |
visudo -c | проверить все файлы sudoers, включая права на них |
visudo -cf файл | проверить один файл, не устанавливая его |
Редактор берётся из SUDO_EDITOR, VISUAL или EDITOR; например, EDITOR=vim visudo.
Примеры
# выполнить команду от root и от другого пользователя
sudo apt-get update
sudo -u www-data ls -l /srv/app
# что разрешено текущему пользователю
sudo -l
# разрешена ли конкретная команда
sudo -l /usr/bin/systemctl
# root-оболочка с окружением root
sudo -i
# дать пользователю полные права через группу sudo (нужен перелогин)
usermod -aG sudo alice
# своё правило — отдельным файлом через visudo
visudo -f /etc/sudoers.d/deploy
# или создать файл скриптом и обязательно проверить синтаксис
echo 'deploy ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx' > /etc/sudoers.d/deploy
chmod 440 /etc/sudoers.d/deploy
visudo -c
# проверить черновик, не устанавливая его
visudo -cf ./sudoers-draft
# записать в защищённый файл: перенаправление делает оболочка, а не sudo
echo '127.0.0.1 example.local' | sudo tee -a /etc/hosts
# отредактировать системный файл своим редактором, не запуская редактор от root
sudoedit /etc/hosts
# передать одну переменную окружения
sudo --preserve-env=HTTP_PROXY apt-get update
Подводные камни
sudo echo текст > /etc/файл не работает. Перенаправление > выполняет твоя оболочка — ещё без прав root, поэтому «Permission denied». Используй | sudo tee файл (tee -a — дописать) или sudo sh -c 'echo текст > файл'.
- Редактируй только через
visudo — он проверяет синтаксис перед сохранением. Строка с ошибкой в sudoers пропускается: правило молча не заработает, а sudo при каждом запуске будет печатать «syntax error». После правки скриптом всегда запускай visudo -c.
- Имена в
/etc/sudoers.d/. Файлы, в имени которых есть точка (deploy.conf) или которые оканчиваются на ~, игнорируются. Права должны быть 0440, иначе visudo -c ругается, а файл с записью для всех sudo пропустит.
- Порядок правил важен: при нескольких подходящих строках действует последняя. Правило с паролем ниже правила с
NOPASSWD для той же команды снова потребует пароль.
- Аргументы в правиле — точное совпадение. Правило
/usr/bin/systemctl restart nginx не разрешит systemctl restart nginx.service. А команда без аргументов в правиле разрешает любые аргументы.
- Встроенные команды оболочки (
cd, export, source) через sudo не запустить — это не программы. Для них — sudo -i или sudo sh -c '…'.
- Окружение сбрасывается.
PATH заменяется на secure_path из sudoers, HOME становится домашним каталогом целевого пользователя, большинство переменных теряется. Скрипт из ~/bin может «не найтись» под sudo.
- Опасные разрешения. Правило на
/usr/bin/tail позволит прочитать /etc/shadow, на vim, less, find, tar — запустить из них оболочку root. Для правки файлов давай sudoedit, а не редактор.
- Новая группа
sudo начнёт действовать только в новой сессии пользователя.
См. также
useradd · su · id · chmod · redirection · tee · env