← Весь справочник

su

Сменить пользователя в оболочке — su, su -, su -c, su -s; чем отличается от sudo -i

su (substitute user) запускает оболочку или одну команду от имени другого пользователя — по умолчанию root. Пароль спрашивается целевого пользователя; root может переключиться на кого угодно без пароля. Для разовой команды с правами root обычно удобнее sudo, а su чаще нужен, когда root запускает что-то от имени служебной учётной записи.

Синтаксис

su [опции] [-] [пользователь [аргументы…]]
su - alice                       # войти как alice с её окружением
su alice -c 'команда'            # выполнить одну команду
su -s /bin/bash svc -c 'команда' # обойти nologin в /etc/passwd

Опции

ОпцияЧто делает
-, -l, --loginоболочка входа: чистое окружение, переход в домашний каталог, чтение ~/.profile
-c 'команда'выполнить одну команду через оболочка -c и выйти; код возврата — код команды
-s оболочказапустить указанную оболочку вместо той, что записана в /etc/passwd
-m, -pне трогать окружение: HOME, SHELL, USER остаются от вызывающего
-w VAR1,VAR2при - сохранить перечисленные переменные
-g группаосновная группа (только для root)
-G группадополнительная группа (только для root)
-Pвыделить новый псевдотерминал

Аргументы после имени пользователя передаются оболочке: в su alice -c 'echo $0 $1' x y переменная $0 будет x, $1 — y.

su, su - и sudo

КомандаЧей парольОкружениеКаталог
su alicealiceHOME, SHELL, USER, LOGNAME — от alice, остальные переменные остаются твоимитекущий
su - alicealiceчистое окружение alice, читается ~/.profile/home/alice
su -rootчистое окружение root/root
sudo -iтвойкак su -, но по правилам sudoers/root
sudo -u alice -iтвойкак su - alice/home/alice
sudo -sтвойоболочка root, окружение почти твоётекущий

/sbin/nologin и служебные учётные записи

У служебных пользователей (www-data, nobody, созданных через useradd -r -s /usr/sbin/nologin) в /etc/passwd стоит оболочка /usr/sbin/nologin (то же, что /sbin/nologin). Она печатает «This account is currently not available.» и завершается с кодом 1 — поэтому su svc и su svc -c '…' не работают. Чтобы выполнить команду от такого пользователя, root явно задаёт оболочку: su -s /bin/bash svc -c '…' или пользуется sudo -u svc команда.

Примеры

# стать root с полноценным окружением
su -
sudo -i            # то же, если пароль root не задан (как в Ubuntu)

# одна команда от имени alice; кавычки обязательны
su - alice -c 'whoami; pwd'

# переменные внутри -c раскрываются уже у alice — бери в одинарные кавычки
su - alice -c 'echo $HOME'

# служебный пользователь с nologin
useradd -r -s /usr/sbin/nologin svc
su svc -c id                       # This account is currently not available.
su -s /bin/bash svc -c id          # работает
sudo -u svc id                     # работает, оболочку sudo не запускает

# передать одну переменную в чистое окружение
APP_ENV=prod su -w APP_ENV - alice -c 'echo $APP_ENV'

# запустить от alice с основной группой devs (только root)
su -g devs alice -c id

Подводные камни

  • su без - оставляет твоё окружение. PATH, переменные приложения и текущий каталог остаются прежними, поэтому команда может вести себя не так, как при настоящем входе пользователя. Нужна «чистая» сессия — пиши su -.
  • -c принимает одну строку. su alice -c ls -l выполнит только ls, а -l уйдёт в опции самого su. Бери команду в кавычки целиком.
  • Двойные кавычки раскрывает твоя оболочка. В su - alice -c "echo $HOME" подставится /root ещё до запуска su. Используй одинарные кавычки.
  • У root в Ubuntu нет пароля (в /etc/shadow стоит *), так что su - от обычного пользователя всегда завершается «Authentication failure». Используй sudo -i.
  • Без терминала su не спросит пароль в скрипте: ввод из echo пароль | su … срабатывает лишь случайно и небезопасен. В скриптах root вызывает su без пароля, остальным нужен sudo -n с правилом NOPASSWD.
  • Просроченный пароль или учётная запись блокируют даже su от root: «Your account has expired» или требование сменить пароль. Проверь chage -l пользователь.
  • su -s для nologin-пользователя — это осознанный обход: так можно, но не делай таким пользователям обычную оболочку в /etc/passwd.

См. также

sudo · id · useradd · chage · env