Команда su: разница между su и su -, sudo su и sudo -i и как сменить учётную запись
Чтобы в Linux выполнять команды от другой учётной записи, не выходя из текущей, используйте команду su. При сравнении, когда su запускали из учётной записи root на сервере AlmaLinux 9 в системную учётную запись daemon без возможности входа, один дефис изменил рабочую папку и PATH, а команда выполнилась только после указания оболочки.
Вывод ниже получен на сервере AlmaLinux 9.8 (учётная запись root) и сервере Debian 12 (обычная учётная запись). Экраны с запросом пароля и sudo не запускались на рабочем сервере и описаны по официальным руководствам, а часть значения PATH и номер версии исправления util-linux в симуляторе заменены примерами.
1️⃣ Как пользоваться командой su
Базовая форма — [su имя_учётной_записи], а если имя не указать, su переключится на root. Если ввести exit в новой оболочке, она завершится, и вы вернётесь в оболочку исходной учётной записи, которая запустила su.
При запуске из обычной учётной записи в строке Password: вводится пароль целевой учётной записи (по настройкам PAM по умолчанию). На этом сервере /etc/pam.d/su пропускает проверку, если запускает root, поэтому при переходе из учётной записи root в daemon пароль не запрашивался.
su --help
Usage:
su [options] [-] [<user> [<argument>...]]
Change the effective user ID and group ID to that of <user>.
A mere - implies -l. If <user> is not given, root is assumed.
Options:
-m, -p, --preserve-environment do not reset environment variables
-w, --whitelist-environment <list> don't reset specified variables
-g, --group <group> specify the primary group
-G, --supp-group <group> specify a supplemental group
-, -l, --login make the shell a login shell
-c, --command <command> pass a single command to the shell with -c
--session-command <command> pass a single command to the shell with -c
and do not create a new session
-f, --fast pass -f to the shell (for csh or tcsh)
-s, --shell <shell> run <shell> if /etc/shells allows it
-P, --pty create a new pseudo-terminal
-h, --help display this help
-V, --version display version
For more details see su(1).Как сказано в справке, дефис [-] — это опция входа, то же самое, что [-l], а аргументы после имени учётной записи передаются оболочке целевой учётной записи. На сервере AlmaLinux 9 su входила в пакет util-linux 2.37, а на сервере Debian 12 — в пакет 2.38.
su --versionsu from util-linux 2.38.1Может ли учётная запись, на которую вы хотите переключиться, открыть оболочку, видно по последнему полю её строки в getent passwd.
getent passwd daemondaemon:x:2:2:daemon:/sbin:/sbin/nologinОболочкой daemon был /sbin/nologin. Учётная запись, у которой вместо оболочки входа указан nologin, не открывает оболочку даже после переключения через su.
2️⃣ Разница между su и su -
С дефисом (-) su открывает ту же оболочку, что и при входе под целевой учётной записью. В папке /tmp одна и та же команда была запущена один раз без дефиса и один раз с дефисом.
su -s /bin/sh -c pwd daemon/tmpsu - -s /bin/sh -c pwd daemon/usr/sbinБез дефиса рабочая папка осталась /tmp, а [su -] перешла в домашнюю папку daemon — /sbin. На этом сервере /sbin — ссылка на /usr/sbin, поэтому pwd показал /usr/sbin.
Из переменных окружения сравнивались только пять строк вывода env: HOME, USER, SHELL, PATH и LOGNAME.
su -s /bin/sh -c env daemon | grep -E '^(HOME|USER|SHELL|PATH|LOGNAME)='SHELL=/bin/sh
LOGNAME=daemon
HOME=/sbin
USER=daemon
PATH=/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/binsu - -s /bin/sh -c env daemon | grep -E '^(HOME|USER|SHELL|PATH|LOGNAME)='SHELL=/bin/sh
LOGNAME=daemon
HOME=/sbin
USER=daemon
PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbinHOME, USER и LOGNAME в обоих случаях получили значения daemon. Без дефиса PATH сохранил значение root, запустившего su, а с [su -] был задан заново по настройкам входа.
Согласно официальному руководству, su без дефиса меняет только HOME и SHELL, а USER и LOGNAME меняет лишь тогда, когда целевая учётная запись не root. Поэтому если переключиться на root из обычной учётной записи без дефиса, в USER останется имя исходной учётной записи.
[$0], который выводит имя оболочки, тоже отличался.
su -s /bin/sh -c 'echo $0' daemonshsu - -s /bin/sh -c 'echo $0' daemon-shС [su -] перед именем оболочки появился дефис, и вывелось -sh. Оболочка, имя которой начинается с дефиса, работает как оболочка входа и читает файлы настроек входа (согласно официальному руководству). Различия между двумя формами приведены ниже.
| Сравнение | su | su - |
|---|---|---|
| Рабочая папка | Без изменений (/tmp) | Домашняя папка целевой учётной записи (/usr/sbin) |
| HOME, USER, LOGNAME | Значение daemon | Значение daemon |
| PATH | Значение root, запустившего su | Задаётся заново настройками входа |
| Имя оболочки ($0) | sh | -sh (оболочка входа) |
| Прочие переменные окружения | Остаются как есть | Удаляются, кроме некоторых, например TERM (согласно официальному руководству) |
Официальное руководство советует всегда добавлять опцию входа, чтобы окружения не смешивались, и писать [--login] вместо дефиса. su без дефиса сохраняет текущую папку и PATH, поэтому если вы хотите проверить команду с настройками другой учётной записи, результат может отличаться от [su -].
3️⃣ Опции su -c и su -s
Чтобы выполнить одну команду от другой учётной записи, не открывая оболочку, напишите команду после -c. Когда id запустили через [su -c] в учётной записи с nologin, вместо результата команды появилось сообщение об отказе.
su -c id daemonThis account is currently not available.Команду, переданную через -c, тоже принимает и выполняет оболочка учётной записи, поэтому если оболочка — nologin, до команды дело не доходит. В таком случае укажите через -s оболочку для запуска.
su -s /bin/sh -c id daemonuid=2(daemon) gid=2(daemon) groups=2(daemon)С указанием /bin/sh id выполнилась с UID 2 учётной записи daemon. Эту форму используют, чтобы проверить права на файлы или результат команд от служебной учётной записи.
Если оболочка целевой учётной записи — ограниченная оболочка, которой нет в /etc/shells, например nologin, сменить оболочку через -s может только root. Согласно официальному руководству, в этом случае -s и переменная SHELL, указанные пользователем не root, игнорируются.
Если в команде после -c есть пробелы, заключите её в кавычки, чтобы передать одним блоком. su возвращает код завершения выполненной команды как есть, 126, если команду не удалось запустить, и 127, если она не найдена (согласно официальному руководству).
📌 Основные опции: результаты из этой статьи
| Опция | Назначение | Результат в этой статье | |
|---|---|---|---|
| - | Открывает ту же оболочку, что и при входе под целевой учётной записью, и переходит в её домашнюю папку | В /tmp без дефиса pwd дал /tmp, с дефисом — /usr/sbin, а echo $0 вывел -sh | |
| -c команда | Выполняет одну команду в оболочке целевой учётной записи, не открывая оболочку | su -c id daemon в учётной записи с nologin daemon вывел [This account is currently not available.] | |
| -s оболочка | Запускает указанную оболочку вместо записанной в учётной записи; для учётных записей с ограниченной оболочкой — только root | su -s /bin/sh -c id daemon вывел uid=2(daemon) gid=2(daemon) groups=2(daemon) | |
| --help | Выводит справку по использованию и список опций | Строка Usage и список опций -m, -w, -g, -G, -l, -c, -f, -s, -P, -h, -V | |
| --version | Выводит сведения о версии | su from util-linux 2.38.1 на сервере Debian 12 |
📎 Другие опции: по официальному руководству
| Опция | Назначение | |
|---|---|---|
| -l | Опция входа, как дефис (-); длинное имя --login | |
| -m | Оставляет переменные окружения и не меняет HOME, SHELL, USER и LOGNAME; вместе с опцией входа игнорируется (то же, что -p) | |
| -w список | Сохраняет перечисленные через запятую переменные, когда опция входа очищает окружение; HOME, SHELL, USER, LOGNAME и PATH задаются заново | |
| -g группа | Задаёт основную группу; только root | |
| -G группа | Задаёт дополнительные группы; только root; без -g первая дополнительная группа становится основной | |
| -f | Передаёт -f оболочке; опция для csh и tcsh | |
| -P | Создаёт новый псевдотерминал, чтобы не делить терминал с исходным сеансом | |
| --session-command команда | То же, что -c, но без нового сеанса; руководство не рекомендует |
🔲 Симулятор команды su
Симулятор ниже начинается с обычной учётной записи user1: можно самому ввести su, [su -] и sudo и вернуться через exit. Учётные записи и пароли — примеры.
4️⃣ Разница между sudo su и sudo -i
sudo su — это запуск su с правами root через sudo. Поскольку su запускает root, пароль root не запрашивается, а перед этим sudo запрашивает пароль того, кто его запускает (согласно официальной документации).
Какие учётные записи могут запускать sudo, задаётся в настройках /etc/sudoers. Если sudo запускает учётная запись без разрешения, она получает отказ с сообщением [user1 is not in the sudoers file.] (по тексту сообщения в программе).
Для каждой команды, открывающей оболочку root, запрашиваемый пароль и рабочая папка приведены ниже. Команды этого раздела не запускались на рабочем сервере и описаны по руководствам su(1) и sudo(8).
| Команда | Запрашиваемый пароль | Запускаемая оболочка | Рабочая папка |
|---|---|---|---|
| su | root | Оболочка root | Без изменений |
| su - | root | Оболочка входа root | /root |
| sudo su | Учётная запись, которая запустила | Оболочка root | Без изменений |
| sudo su - | Учётная запись, которая запустила | Оболочка входа root | /root |
| sudo -i | Учётная запись, которая запустила | Оболочка входа root | /root |
| sudo -s | Учётная запись, которая запустила | Оболочка из переменной SHELL (права root) | Без изменений |
[sudo -i] и [sudo su -] обе заканчиваются оболочкой входа root. В [sudo -i] sudo сразу запускает оболочку root как оболочку входа, а [sudo su -] по пути ещё раз проходит через su.
[sudo -s] запускает оболочку из переменной SHELL с правами root и не переходит в домашнюю папку. После одного правильного ввода пароля sudo по умолчанию не спрашивает его снова в том же терминале 5 минут (согласно руководству sudoers).
Разница между su и sudo — как разница между тем, чтобы взять у кого-то ключ от дома, и тем, чтобы записаться у консьержа и пройти внутрь.
5️⃣ Ошибки команды su
Если переключиться на учётную запись без возможности входа, вместо оболочки запускается nologin и появляется [This account is currently not available.]. При запуске [su daemon] от root вывелась только эта строка, а код завершения был 1.
su daemonThis account is currently not available.Это сообщение выводит программа nologin, указанная в последнем поле строки учётной записи, и тот же текст нашёлся внутри /usr/sbin/nologin на сервере. Под root можно указать оболочку через -s и выполнять команды от этой учётной записи.
Если пароль неверный, появляется [su: Authentication failure]. Этот текст — сообщение, которое библиотека PAM возвращает при неудачной проверке подлинности. Согласно официальному руководству, если su завершается неудачей до запуска команды, код завершения — 1.
Если su отказывает, хотя пароль своей учётной записи введён правильно, сначала проверьте, не запрашивается ли здесь пароль целевой учётной записи. sudo спрашивает пароль того, кто его запускает, а su — пароль учётной записи, на которую вы переключаетесь.
Если ввести имя несуществующей учётной записи, появляется [su: user user9 does not exist or the user entry does not contain all the required fields] (по тексту сообщения в программе). Причины и что проверить для каждой ошибки — ниже.
| Вывод | Причина | Что проверить |
|---|---|---|
| This account is currently not available. | Оболочка целевой учётной записи — nologin | Последнее поле строки учётной записи в getent passwd; под root укажите оболочку через -s |
| su: Authentication failure | Неверный пароль | Пароль ли это целевой учётной записи (sudo спрашивает ваш) |
| su: user user9 does not exist … | Нет учётной записи с таким именем | getent passwd имя_учётной_записи |
| user1 is not in the sudoers file. | Учётная запись без разрешения на sudo | Настройки sudoers и группа wheel |
🔢 FAQ & рекомендуемые материалы
Права · владение
Права Linux (4,2,1) и владение | команды chmod, chown, umask
Статья о том, как проверить и изменить права на чтение, запись и выполнение, а также владельца файлов и каталогов.
Пользователи и доступ
Команды Linux who, w & команда user
Команды, которые показывают, какие пользователи сейчас вошли на сервер и что они выполняют.
Сеть и доступ
Команда SSH: опции и использование
Статья о базовой форме и опциях команды ssh, которая подключается к удалённому серверу под учётной записью пользователя.
ℹ️ О партнёрских ссылках
Материалы этого сайта содержат партнёрские ссылки. Если посетитель покупает товар или услугу по такой ссылке, сайт получает комиссию от продавца. При этом сумма, которую платит покупатель (при акционных скидках сумма снижается ↓), не увеличивается. Указанные цены, скидки и наличие актуальны на момент написания и могут отличаться, поэтому перед покупкой уточняйте их у продавца. Товары выбираются и оцениваются по нашим собственным критериям, а комиссия не влияет ни на порядок, ни на содержание обзоров.