Команда su

Команда su — традиционный способ получения прав администратора внутри сеанса обычного пользователя (независимо, консольного или Иксового). Насколько я знаю, она испокон веков существует во всех POSIX-совместимых системах. Её GNU-версия, используемая в Linux, входит в состав пакета coreutils.

Имя этой команды иногда трактуют как аббревиатуру от Super User, но на самом деле оно означает Set UID, потому что она позволяет получить права не только администратора, но и любого другого пользователя — достаточно указать его имя в качестве аргумента:

$ su username

После чего ввести его пароль. При этом некоторые переменные окружения (например, текущий каталог), однако, наследуются от пользователя, давшего команду, а не от того, чей идентификатор был получен в результате её исполнения. Дабы полностью воспроизвести shell-окружение нового пользователя, эту команду надо дать в форме

$ su -l username

где опция l символизирует, что все переменные из профильного файла командной оболочки пользователя (login shell) будут перечитаны заново.

Вместо командной оболочки пользователя, прописанной как login shell в атрибутах его аккаунта, можно использовать и любую другую, из числа установленных в системе и, что немаловажно, фигурирующую в файле /etc/shells (впрочем, любой шелл, установленный штатным для данного дистрибутива способом, как правило, попадает туда автоматически). Для этого существует специальная опция, значением которой будет путь и имя исполняемого файла оболочки. Например, команда

$ su -l username -s /bin/zsh

создаст сеанс пользователя username с оболочкой zsh в качестве login shell вместо той, которая прописана для него по умолчанию. Впрочем, этой возможностью вряд ли кто активно пользуется, кроме как в экспериментальных целях — например, для оценки возможностей некоего свежеустановленного шелла.

Команда su, данная без опций и аргумента, предоставляет, по вводе соответствующего пароля, доступ именно к суперпользовательскому аккаунту. Если мы пароль знаем и введем правильно — казалось бы, ничего не произойдет, никаких сообщений не последует. Правда, присмотревшись, можно увидеть, что изменился вид приглашения командной строки (как — зависит от настроек командной оболочки, по умолчанию для bash — с символа доллара, $, на символ решётки, #). И это должно послужить сигналом к повышенному вниманию — с данного момента наш обычный пользователь наделен полномочиями root’а.

Правда, как уже было сказано, все настройки среды пользователя, эту команду отдавшего, сохраняются. Если требуется получить доступ к переменным окружения администратора в полном объеме (в частности, к путям поиска исполнимых файлов, которые для root’а и обычного пользователя могут быть разными), используется упомянутая выше форма

$ su -l

или, ещё короче,

$ su -

После этого никаких отличий от ситуации, когда мы авторизовались root’ом в ответ на первичное приглашение в консоли, не обнаружится. Обратим внимание на то, что текущий каталог, в котором была отдана команда, сменится на домашний каталог суперпользователя — /root, потому что это довольно распространённый источник ошибок начинающих пользователей.

В большинстве Linux-систем права администратора посредством команды su может получить любой пользователь, имеющий аккаунт в данной системе. Однако в BSD-системах и некоторых, следующих их примеру, дистрибутивах Linux (в частности, Gentoo) по умолчанию введено ограничение: доступ к суперпользовательскому аккаунту имеют только пользователи, входящие в определённую группу — wheel. А в OpenSolaris получить доступ к правам администратора (но не к его аккаунту -- об этом мы поговорим специально) может только тот пользователь, в репертуаре которого (то есть в атрибутах учётной записи) указана соответствующая роль; по умолчанию это первый обычный пользователь, зарегистрировавшийся в системе при инсталляции.

Впрочем, доступ к root-аккаунту можно изменить в любую сторону — как ограничить, так и “демократизировать”. Как — зависит от дистрибутива, точнее, от метода аутентификации пользователей. Так, в Fedora, по умолчанию использующей PAM-аутентификацию без задействования группы wheel, для ограничения административного рвения пользователей следует отредактировать файл /etc/pam.d/su, а именно — снять комментарии со следующих строк:

#auth           sufficient      pam_wheel.so trust use_uid

# Uncomment the following line to require a user to be in the "wheel" group.

#auth           required        pam_wheel.so use_uid

А перед этим надо, разумеется, не забыть добавить особо доверенных пользователей — в частности, себя, любимого, в эту группу командой вроде

# usermod -G wheel username

данной от лица суперпользователя.

У меня в любой системе, в которой я работаю сколько-нибудь продолжительное время, сосуществует два аккаунта: для моей скромной персоны при исполнении производственных обязанностей, и для неё же, занимающейся экспериментами, подчас нездоровыми. Так вот, в группу wheel я включаю только первого пользователя, дабы шаловливые ручонки второго не напортачили что-нибудь всерьёз.

Созданный командой su “сеанс в сеансе” будет продолжаться неограниченно долго, до тех пор, пока не будет завершён явным образом — командой exit, которая вернёт обычное пользовательское окружение, в том числе и текущий каталог, в котором мы находились до начала “вторичного сеанса”.

Нередко, однако, административные полномочия нужны для выполнения одной- единственной команды. Например, нелепо открывать внутренний сеанс суперпользователя для того, чтобы только посмотреть текущую разметку диска командой вроде fdisk -l. Что же, команда su предоставляет нам и такую возможность — посредством опции -c (или –command=), значениями которой будет выступать требуемая команда вместе со всеми необходимыми опциями и аргументами. Например, команды

$ su -c 'fdisk -l /dev/sdb'

или

$ su --command='fdisk -l /dev/sdb'

после ввода пароля суперпользователя выведут нам информацию об указанном диске точно так же, как это было бы после последовательности команд

$ su

[пароль]

fdisk /dev/sdb

Опять же обращаю внимание, что имя команды вместе с опциями и аргументами должно быть экранировано кавычками — иначе, скажем, аргумент /dev/sdb будет воспринят как имя пользователя, чьи права мы желаем получить, что повлечёт за собой сообщение об ошибке. Во всех виденных мной указаниях приводятся именно строгие, одинарные, кавычки (как в нашем примере), однако обычно проходят и нестрогие, двойные.

Неудобство такого способа в том, что после открывающей кавычки в командной строке перестаёт работать автодополнение по нажатию клавиши Tab. То есть сложные команды и пути придётся вводить по памяти. Эта, казалось бы, маловажная, деталь, — та самая соломинка, которая может склонить к использованию sudo вместо su, о чём пойдёт речь на следующей странице.


Содержание


Теги: