С чего начать Первые шаги трек · 15 ступеней
Linux Labs

sudo — выполнение команд от другого пользователя

4 мин Ubuntu 24.04 · sudo 1.9

Даёт временные права root по sudoers; править файл — только через visudo, иначе ошибка лишит sudo всех.

Шпаргалка

6 команд Версия для печати
  • sudo apt update выполнить команду от root
  • sudo -u postgres psql выполнить от другого пользователя
  • sudo -i интерактивный root-shell
  • sudo -l что мне разрешено
  • sudoedit /etc/nginx/nginx.conf безопасно править root-файл
  • sudo visudo -f /etc/sudoers.d/10-x править правила sudoers

Обзор

sudo выполняет команду от имени другого пользователя (по умолчанию root), проверяя права по правилам в sudoers. Лучше, чем сидеть под root: точечно, с логированием, по паролю своего пользователя.

bash
sudo apt update                   # выполнить от root
sudo -u postgres psql             # от другого пользователя
sudo -i                           # интерактивный root-shell (login shell)
sudo -s                           # root-shell без смены окружения
sudo -l                           # какие команды мне разрешены
sudo -k                           # сбросить кэш пароля (следующий sudo спросит снова)
sudo !!                           # повторить предыдущую команду под sudo

Ключи

7

sudoers

Право даёт членство в группе sudo (Ubuntu) / wheel (RHEL), либо явное правило. Никогда не редактируй sudoers напрямую — только через visudo (проверяет синтаксис, иначе можно потерять sudo):

bash
sudo visudo                       # основной файл /etc/sudoers
sudo visudo -f /etc/sudoers.d/90-deploy   # отдельный drop-in (рекомендуется)
sudo visudo -c                    # проверить синтаксис всех файлов

Формат правила и алиасы:

# кто   где = (от кого)      что
alice   ALL = (ALL:ALL)      ALL
deploy  ALL = (root) NOPASSWD: /bin/systemctl restart myapp, /bin/systemctl status myapp
%devs   ALL = (root)         /usr/bin/apt        # %группа
Cmnd_Alias SERVICES = /bin/systemctl restart nginx, /bin/systemctl reload nginx
web     ALL = (root) NOPASSWD: SERVICES

NOPASSWD: — без запроса пароля (для автоматизации; держи область узкой!).

Опции и sudoedit

Полезные Defaults (в /etc/sudoers.d/):

Defaults        env_reset                          # чистое окружение (безопасно)
Defaults        secure_path="/usr/sbin:/usr/bin:/sbin:/bin"
Defaults        timestamp_timeout=15               # минут кэш пароля (0 = всегда спрашивать)
Defaults:deploy !requiretty
Defaults        logfile="/var/log/sudo.log"        # отдельный лог
bash
sudo -E cmd                       # сохранить переменные окружения (если разрешено)
sudoedit /etc/nginx/nginx.conf    # = sudo -e: править root-файл своим $EDITOR безопасно
sudo -v                           # продлить кэш пароля (для длинных скриптов)

sudoedit правит копию от твоего имени и атомарно кладёт назад — безопаснее, чем sudo vim (не запускает редактор от root).

Ключ Что делает Пример
-u user Выполнить команду от указанного пользователя, а не от root. sudo -u postgres psql
-i Интерактивный root-shell с окружением root (login shell). sudo -i
-l Показать, какие команды разрешены текущему пользователю. sudo -l
-s Root-shell без смены окружения текущего пользователя. sudo -s
-k Сбросить кэш пароля — следующий sudo снова спросит пароль. sudo -k
-E Сохранить переменные окружения вызывающего пользователя, если это разрешено правилом. sudo -E make install
-v Продлить кэш пароля без выполнения команды — удобно перед долгим скриптом. sudo -v

Ничего не найдено. Попробуй запрос короче.

Неполадки

5

user is not in the sudoers file

Пользователя нет в группе sudo. От root: usermod -aG sudo alice (нужен релогин, см. users-groups).

sudo: a terminal is required to read the password

Нет TTY (по SSH без -t или из скрипта). Варианты: NOPASSWD для нужной команды, ssh -t, либо sudo -S (пароль из stdin).

NOPASSWD не срабатывает для смены пользователя

(root) NOPASSWD: ALL разрешает команды от root, но не sudo -u other. Для смены без пароля — правило (other) или sudo runuser -u other -- cmd.

Команда работает руками, но не через sudo (PATH/env)

env_reset/secure_path чистят окружение. Зови по полному пути или настрой secure_path; для переменных — sudo -E (если разрешено).

Сломал sudoers, потерял доступ

visudo не даст сохранить файл с ошибкой. Если всё же потерял — зайди через root-консоль (recovery/гипервизор) и поправь.

Опасно

NOPASSWD без узкой команды в правиле (NOPASSWD: ALL вместо конкретного пути) даёт полный доступ к root без единой проверки — держи область правила максимально узкой, особенно для сервисных учёток. Правь sudoers только через visudo: он проверяет синтаксис перед сохранением, а прямая правка файла редактором может оставить систему без единого рабочего способа получить root.

Термины

2
авторизация authorization
Решение о разрешённых действиях для установленной личности и её полномочий. Ещё встречается в: curl, HTTP
root (суперпользователь) root (superuser)
Учётная запись с UID 0: ядро пропускает для неё большинство проверок прав доступа. Команды от имени root обычно выполняют через sudo. Ещё встречается в: Capabilities: права root по частям, PAM: проверка входа, политика паролей и блокировка, Ограничения службы: User=, ProtectSystem, NoNewPrivileges, Docker и ещё 65

См. также

  • visudo — править sudoers и файлы /etc/sudoers.d с проверкой.
  • permissions — Модель прав Unix — чтение/запись/исполнение, владелец/группа/другие, спецбиты.
  • users-groups — Учётные записи, группы, членство; useradd/usermod, /etc/passwd и /etc/group.
Загрузка…