SUDO

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

Программа sudo имеет root в качестве владельца исполняемого файла и установленный атрибут SUID. Проверьте это самостоятельно.

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

При запуске sudo сверяется с файлом /etc/sudoers, чтобы проверить, может ли запустивший её пользователь получить права суперпользователя для выполнения команды. Если да, пользователю предлагается ввести пароль (не пароль рута, а собственный. Вдруг настоящий пользователь отошел, а за терминалом кто-то другой?), после чего запускает команду на исполнение с EUID=0, то есть с правами суперпользователя.

## /etc/sudoers

Файл настроек sudo — /etc/sudoers. Лучше не редактировать этот файл напрямую, для этого используют команду visudo (это не значит, что вы будете редактировать его с помощью vi. Будет вызван редактор по умолчанию, в т.ч. nano или mcedit):

Эта программа загружает файл в редактор и выполняет его блокировку, чтобы одновременно никто не выполнял его редактирование этой командой. После завершения редактирования программа выполняет проверку формата файла на правильность, чтобы никто его случайно не испортил. Строки файла /etc/sudoers в простейшем варианте имеют следующий формат:

User — имя пользователя или группы (если начинается с %). ALL для всех пользователей. Заданные пользователи или участники группы имеют права выполнять команды на указанных хостах с правами суперпользователя. host — обычно на этом месте строчка ALL, что идентифицирует все компьютеры в сети. Также здесь может быть localhost, то есть локальный компьютер или имя/адрес компьютера. Поле полезно, когда в большой сети поддерживается единый файл /etc/sudoers и на разных компьютерах этой сети в sudo требуется разрешить разные команды. Command — может быть ALL для любой команды или список команд. Возможно указание опций, например, NOPASSWD: разрешает выполнение команды без запроса пароля. Команду обязательно надо указывать с полным путем. В качестве примера разрешим пользователю user через sudo выполнять остановку системы командой shutdown без запроса пароля. Это можно сделать, добавив в /etc/sudoers строчку:

Кроме выполнения команд от имени суперпользователя, sudo можно использовать для выполнения команд с любыми GID или UID. В таком варианте в /etc/sudoers используется более сложный формат:

В таком варианте добавлены новые параметры user и group. При установке Ubuntu был создан пользователь с возможностью выполнять любые команды с любыми UID и GID через стандартную конфигурацию sudo. Такое право даёт пользователю членство в группе sudo, которая описана в стандартном /etc/sudoers строкой:

В разных версиях Linux данная группа может называться по-разному, в Ubuntu после 12 версии это группа sudo.

sudo можно использовать для запуска команд от имени других пользователей и групп c помощью ключей -u и -g

Обратите внимание, что во втором варианте использования EGID поменялся на developer, до этого была установлена первичная для petrov группа petrov. Иногда бывает необходимо выполнить подряд несколько команд и не хочется каждый раз набирать sudo перед командой. В таком случае, если вы уверены в своих силах, можно использовать sudo с параметром -i:

user@vlamp: ~$ sudo -i

root@vlamp: ~#

После того, как оболочка суперпользователя больше не нужна, сеанс sudo надо завершить командой exit или комбинацией ^D.

su
--

Кроме sudo, в UNIX есть более старая команда с похожим функционалом, команда su (switch user). В простейшем случае надо набрать su user, где user имя пользователя, в которого мы хотим переключиться. Система запросит пароль для этого пользователя и запустит оболочку c UID и GID пользователя. После завершения действий также нужно выйти с помощью exit.

Без параметров su запустит сеанс оболочки от имени рута. Придется указать пароль от рута, а после завершения действий также выполнить exit. В отличие от sudo, для su надо знать пароль другого пользователя. В случае суперпользователя su не будет работать, пока не задать пароль пользователю root (по умолчанию пароля нет).

`su -c id petrov`