Команда su: разница между su и su -, sudo su и sudo -i и как сменить учётную запись

Тестовая средаСемейство RHELAlmaLinux 9.8util-linux 2.37Учётная запись rootDebian 12 · util-linux 2.38 обычная учётная записьПроверено 2026-11-05
Выполнение команд от другой учётной записи

Чтобы в Linux выполнять команды от другой учётной записи, не выходя из текущей, используйте команду su. При сравнении, когда su запускали из учётной записи root на сервере AlmaLinux 9 в системную учётную запись daemon без возможности входа, один дефис изменил рабочую папку и PATH, а команда выполнилась только после указания оболочки.

Вывод ниже получен на сервере AlmaLinux 9.8 (учётная запись root) и сервере Debian 12 (обычная учётная запись). Экраны с запросом пароля и sudo не запускались на рабочем сервере и описаны по официальным руководствам, а часть значения PATH и номер версии исправления util-linux в симуляторе заменены примерами.

1️⃣ Как пользоваться командой su

  • ↪️ Базовая форма и возврат через exit

Базовая форма — [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 --version
su from util-linux 2.38.1

Может ли учётная запись, на которую вы хотите переключиться, открыть оболочку, видно по последнему полю её строки в getent passwd.

getent passwd daemon
daemon:x:2:2:daemon:/sbin:/sbin/nologin

Оболочкой daemon был /sbin/nologin. Учётная запись, у которой вместо оболочки входа указан nologin, не открывает оболочку даже после переключения через su.

2️⃣ Разница между su и su -

  • ↪️ Оболочка входа и переменные окружения

С дефисом (-) su открывает ту же оболочку, что и при входе под целевой учётной записью. В папке /tmp одна и та же команда была запущена один раз без дефиса и один раз с дефисом.

su -s /bin/sh -c pwd daemon
/tmp
su - -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/bin
su - -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/sbin

HOME, USER и LOGNAME в обоих случаях получили значения daemon. Без дефиса PATH сохранил значение root, запустившего su, а с [su -] был задан заново по настройкам входа.

Согласно официальному руководству, su без дефиса меняет только HOME и SHELL, а USER и LOGNAME меняет лишь тогда, когда целевая учётная запись не root. Поэтому если переключиться на root из обычной учётной записи без дефиса, в USER останется имя исходной учётной записи.

[$0], который выводит имя оболочки, тоже отличался.

su -s /bin/sh -c 'echo $0' daemon
sh
su - -s /bin/sh -c 'echo $0' daemon
-sh

С [su -] перед именем оболочки появился дефис, и вывелось -sh. Оболочка, имя которой начинается с дефиса, работает как оболочка входа и читает файлы настроек входа (согласно официальному руководству). Различия между двумя формами приведены ниже.

Сравнениеsusu -
Рабочая папкаБез изменений (/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 daemon
This account is currently not available.

Команду, переданную через -c, тоже принимает и выполняет оболочка учётной записи, поэтому если оболочка — nologin, до команды дело не доходит. В таком случае укажите через -s оболочку для запуска.

su -s /bin/sh -c id daemon
uid=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 оболочкаЗапускает указанную оболочку вместо записанной в учётной записи; для учётных записей с ограниченной оболочкой — только rootsu -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. Учётные записи и пароли — примеры.

Симулятор команды suutil-linux 2.37
[user1@server1 ~]$
Работает только в браузере; учётные записи и пароли — примеры, а ↑↓ вызывают предыдущие команды (пароли в истории не сохраняются).

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).

КомандаЗапрашиваемый парольЗапускаемая оболочкаРабочая папка
surootОболочка 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

  • ↪️ This account is currently not available · Authentication failure

Если переключиться на учётную запись без возможности входа, вместо оболочки запускается nologin и появляется [This account is currently not available.]. При запуске [su daemon] от root вывелась только эта строка, а код завершения был 1.

su daemon
This 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 & рекомендуемые материалы

Официальное руководство описывает su прежде всего как команду для обычных пользователей и для скриптов, которые запускает root, советует команду runuser, не проходящую проверку подлинности. Форма — [runuser -u учётная_запись -- команда].

Если после -w (--whitelist-environment) перечислить через запятую имена переменных, которые нужно сохранить, [su -] сохранит их при очистке окружения. Согласно официальному руководству, HOME, SHELL, USER, LOGNAME и PATH задаются заново, даже если они есть в списке.

Согласно официальному руководству, su всегда записывает неудачные попытки входа в файл btmp и не пишет в файл lastlog. Записи btmp смотрят командой lastb.

ℹ️ О партнёрских ссылках
Материалы этого сайта содержат партнёрские ссылки. Если посетитель покупает товар или услугу по такой ссылке, сайт получает комиссию от продавца. При этом сумма, которую платит покупатель (при акционных скидках сумма снижается ↓), не увеличивается. Указанные цены, скидки и наличие актуальны на момент написания и могут отличаться, поэтому перед покупкой уточняйте их у продавца. Товары выбираются и оцениваются по нашим собственным критериям, а комиссия не влияет ни на порядок, ни на содержание обзоров.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Докажите, что вы человек: 8   +   1   =