Инструкция по команде su
Команда su используется для запуска команд от имени другого пользователя, например, для запуска утилит с повышенными привилегиями от имени root.
Чтобы выполнить КОМАНДУ с правами root используйте конструкцию:
su -c КОМАНДА
su -c whoami
Чтобы открыть оболочку для пользователя root с инициализацией его переменных среды (например, $HOME):
Чтобы выполнить команду ‘Get-Help Get-Alias -Full’ с правами root в оболочке /usr/bin/pwsh-preview:
su -c 'Get-Help Get-Alias -Full' -s /usr/bin/pwsh-preview
Для чего нужна команда su
su позволяет запускать команды с замещающим идентификатором пользователя и группы.
При вызове без указания пользователя su по умолчанию запускает интерактивную оболочку от имени пользователя root. Когда указан пользователь, могут быть предоставлены дополнительные аргументы, и в этом случае они передаются оболочке.
Для обратной совместимости su по умолчанию не изменяет текущий каталог и устанавливает только переменные среды $HOME и $SHELL (плюс $USER и $LOGNAME, если целевой пользователь не является пользователем root). Рекомендуется всегда использовать опцию «—login» (вместо её псевдонима «—»), чтобы избежать побочных эффектов, вызванных смешиванием сред.
su в основном предназначен для непривилегированных пользователей, рекомендуемое решение для привилегированных пользователей (например, сценарии, выполняемые пользователем root) — использовать команду runuser без идентификатора пользователя, которая не требует аутентификации и предоставляет отдельную конфигурацию PAM. Если сеанс PAM вообще не требуется, рекомендуется использовать команду setpriv.
Обратите внимание, что su во всех случаях использует PAM (pam_getenvlist) для окончательной модификации среды. Параметры командной строки, такие как —login и —preserve-environment, влияют на среду до того, как она будет изменена PAM.
Что использовать sudo или su?
У программы su похожее назначение: запустить команду с подстановкой ID другого пользователя и группы. То есть одинакового результата можно добиться используя как sudo, так и su.
Различия между этими программами вы найдёте в разделе «Что использовать sudo или su?».
Смотрите также:
- Что такое sudo
- Как пользоваться sudo
Как использовать команду su
Синтаксис команды следующий:
su [ОПЦИИ] [-] [ПОЛЬЗОВАТЕЛИ [АРГУМЕНТ. ]]
Опции команды su:
-c, —command=КОМАНДА
Передаёт команду оболочке с параметром -c.
-f, —fast
Передаёт значение -f оболочке, что может оказаться полезным, а может и не оказаться полезным, в зависимости от оболочки.
-g, —group=ГРУППА
Указывает основную группу. Эта опция доступна только пользователю root.
-G, —supp-group=ГРУППА
Укажите дополнительную группу. Эта опция доступна только пользователю root. Первая указанная дополнительная группа также используется как основная группа, если не указан параметр —group.
-, -l, —login
Запуск оболочки как оболочки с входом в систему со средой, похожей на реальный вход в систему. Эта опция делает следующее:
- • очищает все переменные среды, кроме $TERM и переменных, указанных в —whitelist-environment
- • инициализирует переменные среды $HOME, $SHELL, $USER, $LOGNAME и $PATH
- • изменяет домашнюю папку на папку целевого пользователя
- • устанавливает argv[0] оболочки на «—», чтобы сделать оболочку оболочкой с входом в систему
-m, -p, —preserve-environment
Сохраните всю среду, т.е. не устанавливайте $HOME, $SHELL, $USER или $LOGNAME. Этот параметр игнорируется, если указан параметр —login.
-P, —pty
Создайте псевдотерминал для сеанса. Независимый терминал обеспечивает лучшую безопасность, поскольку пользователь не использует терминал совместно с исходным сеансом. Это можно использовать, чтобы избежать внедрения терминала TIOCSTI ioctl и других атак на безопасность дескрипторов файлов терминала. Весь сеанс также можно переместить в фоновый режим (например, «su —pty — username -c application &»). Если псевдотерминал включён, su работает как прокси-сервер между сеансами (копирует stdin и stdout).
Эта функция в основном предназначена для интерактивных сеансов. Если стандартный ввод — это не терминал, а, например, канал (например, echo «date» | su —pty), то флаг ECHO для псевдотерминала отключён, чтобы избежать беспорядочного вывода.
-s, —shell=ОБОЛОЧКА
Запускает указанную оболочку вместо оболочки по умолчанию. Оболочка для запуска выбирается в соответствии со следующими правилами в следующем порядке:
- оболочка, указанная с помощью —shell
- оболочка, указанная в переменной окружения $SHELL, если используется опция —preserve-environment
- оболочка, указанная в записи passwd целевого пользователя
- /bin/sh
Список доступных в операционной системе оболочек можно вывести командой:
chsh -l
Смотрите также:
- Как в Linux изменить login shell (оболочку входа в систему). Инструкция по команде chsh
- Как узнать, какая оболочка используется в Linux
Если у целевого пользователя ограниченная оболочка (то есть не указана в /etc/shells), параметр —shell и переменные среды SHELL игнорируются, если вызывающий пользователь не является пользователем root.
—session-command=КОМАНДА
То же, что и -c, но не создаёт новый сеанс.
-w, —whitelist-environment=СПИСОК
Не сбрасывать переменные среды, указанные в списке, разделённом запятыми, при очистке среды для —login. Белый список игнорируется для переменных среды $HOME, $SHELL, $USER, $LOGNAME и $PATH.
-V, —version
Отобразите информацию о версии и выйдите.
-h, —help
Показать текст справки и выйти.
Типичными примерами использования su является выполнение КОМАНДЫ от имени root:
su -c КОМАНДА
Также su может использоваться для открытия интерактивной оболочки с правами root:
Как настроить su linux
Вопрос: Как перейти в режим суперпользователя (переключиться в root)?
Ответ: В терминале наберите команду (для читающих по диагонали: минус важен!):
Пояснения: при переходе в режим суперпользователя командой su происходит просто вызов командного интерпретатора с правами root. При этом значения переменных окружения, в частности $PATH , остается таким же, как у пользователя. То есть в переменной $PATH не окажется каталогов /sbin , /usr/sbin , и без указания полного имени будут недоступны команды route , lilo , mkswap и другие. Более того, переменная $HOME будет указывать на каталог пользователя и все программы, запущенные в режиме суперпользователя, сохранят свои настройки с правами рута в каталоге пользователя, что в дальнейшем может вызвать проблемы.
Чтобы избежать этого, следует использовать su — . В этом режиме su запустит командный интерпретатор в качестве login shell (подробнее см. man bash /INVOCATION ), и он будет вести себя в точности так, как если бы в систему залогинился root.
Для раздачи ограниченных прав суперпользователя применяется утилита sudo .
Ввиду наличия псевдонима работает также
$ alias su- alias su-='su -'
Ограничения запуска
При попытке переключиться в администратора в терминале появляется следующая ошибка:
$ su - bash: /bin/su: Отказано в доступе
Штатно пользователю для этого нужно быть в группе wheel (что автоматически выполняется для первого пользователя, заведённого при установке, и настраивается в Центре управления системой). Другие режимы регулируются командой control:
$ /usr/sbin/control su wheelonly $ ls -l `which su` -rws--x--- 1 root wheel 22316 авг 25 2012 /bin/su $ groups | grep wheel cas wheel uucp proc cdrom floppy cdwriter audio radio sambashare vboxusers camera xgrp scanner $ su - Password: #
Также можно разрешить для всех:
control su public
(залогиниться первым пользователем или в консоли Ctrl + ALT + F2 самим root.
Ошибки, возникающие при неправильном использовании su
Чаще всего пользователь, который неправильно запускал su сталкивается с некорректной работой различных программ — не сохраняются конфигурационные файлы, не работают настройки, происходят произвольные сообщения об ошибках записи. Рекомендуется проверить домашний каталог на наличие файлов, принадлежащих пользователю root командой:
$ find $HOME -user root
если ваша система исправна, то список файлов будет пустой.
Ссылки
- Bug 23700: Совместимость по параметрам и поведению с версией из Red Hat
- Получение_прав_root
- Настройка sudo
- Как обойтись без прав root. Часть 2
su или sudo?
С давних времен многих смущает разнообразие вариантов обеспечения безопасности при выполнении операций с максимальными привилегиями. Например, в официальной документации Ubuntu в качестве команды редактирования рекомендуется использовать что-то вроде sudo nano , а в многочисленных любительских мануалах (в стиле «5 фокусов в командной строке, которые удивят вашу бабушку») для получения root’ового шелла предлагается писать sudo su — . Попробую объяснить, почему такое положение вещей кажется мне неправильным.
Исторически единственным универсальным способом выполнить команду от имени другого пользователя в Unix была программа su. Запущенная без параметров, она запрашивала пароль суперпользователя и в случае успеха просто подменяла текущее имя пользователя на root, оставляя почти все переменные окружения от старого пользователя (кроме PATH, USER и еще пары-тройки, см. man su от своего дистрибутива). Более корректно было запускать ее как su — — в таком случае оболочка получала также и правильный environment. С параметром -c можно было выполнить команду: su -c «vim /etc/fstab» .
При этом доверенным пользователям приходилось помнить пароль root’а и у всех пользователей, перечисленных в группе «wheel» (т.е. в группе, члены которой могли выполнить команду su и стать суперпользователем), был одинаковый неограниченный доступ ко всей системе, что являлось серьёзной проблемой безопасности.
Затем появилась команда sudo, и это был прорыв. Теперь администратор мог указывать список разрешенных команд для каждого пользователя (или группы пользователей), файлы, доступные для редактирования, специальные переменные окружения и многое другое (все это великолепие управляется из /etc/sudoers , см. man sudoers от своего дистрибутива). При запуске sudo спрашивает у пользователя его собственный пароль, а не пароль root. Полноценный шелл можно получить с помощью » sudo -i «
Стоит особо упомянуть о специальной команде sudoedit , безопасно запускающей редактор, указанный в переменной окружения $EDITOR . При более традиционной схеме редактирование файлов производилось примерно так:
sudo vi /etc/fstab
Запускаемый таким образом vi наследовал оболочку с неограниченными правами и через :! пользователь мог запускать любую команду (если, конечно, админ не позаботился об этом заранее) и открыть любой файл.
sudoedit проверяет, можно ли этому пользователю изменять данный файл, затем копирует указанный файл во временный каталог, открывает его в редакторе (который наследует права пользователя, а не root’а), а после редактирования, если файл был изменён, с особыми предосторожностями копирует его обратно.
В Debian-based дистрибутивах пользователь root не имеет пароля, вместо этого все административные действия должны производиться через sudo или его графический аналог gksudo . Являясь полной заменой su , sudo должна бы быть единственной командой переключения между пользователями, однако, как было сказано вначале, в настоящий момент это не так и все зачем-то изобретают дикие последовательности из sudo, su, vi и черточек.
Поэтому предлагаю всем раз и навсегда запомнить:
| что хотим сделать? | правильно | неправильно |
| выполнить команду от имени root | sudo command | |
| отредактировать файл от имени root | sudoedit file | |
| получить оболочку root | sudo -i |
После первой публикации этой заметки мне было задано несколько вопросов. Из ответов получилось сделать мини-FAQ.
Q: как с помощью sudo сделать su -c «echo 1 > /etc/privileged_file» ? sudo echo 1 /etc/privileged_file ругается на «permission denied»
A: Это происходит потому, что только команда echo выполняется в повышенными правами, а результат перенаправляется в файл уже с правами обычного пользователя. Чтобы добавить что-нибудь в privileged_file, нужно выполнить такую команду:
$ echo 1| sudo tee -a privileged_file >/dev/null
Или же временно стать рутом:
$ sudo -i # echo 1 > privileged_file # exit $
- по умолчанию sudo записывает всю пользовательскую активность в syslog-канал authpriv (как правило, результат кладется в файл /var/log/auth.log), а в su подобную фичу надо включать с помошью задания специального параметра в файле настроек, различающемся от дистрибутива к дистрибутиву ( SULOG_FILE в /etc/login.defs в Ubuntu Linux, /etc/login.conf и /etc/pam.d/su в FreeBSD и т.д.)
- в случае с su администратор системы не может ограничить команды, выполняемые пользователями, а в sudo — может
- если пользователь должен быть лишен права администрирования, в случае с su после удаления его из группы wheel он должен забыть пароль root’а; если используется sudo, достаточно вынести его из соответствующей группы (например, wheel или admin) и/или файла sudoers, если он был дополнительно настроен.
17. su
Мы с вами уже выяснили, что Linux – система многопользовательская. Если с помощью команды wc посчитать количество строк в файле /etc/passwd:
cat /etc/passwd wc -l /etc/passwd
где перечислены все пользователи, мы увидим, что сейчас в системе 48 пользователей. Среди них есть наш пользователь user, суперпользователь root, а остальные, которых создавали не мы, а система, считаются сервисными пользователями.

Нам сегодня понадобится ещё один пользователь, поэтому создадим его с помощью команды:
sudo useradd user2
введём наш пароль, а потом с помощью:
sudo passwd user2
зададим пароль для второго пользователя.
Начнём с команды su:
Она позволяет залогиниться каким-то пользователем или запускать команды от имени другого пользователя. При этом нужно знать пароль этого другого пользователя. Это бывает нужно, когда у нашего пользователя нет нужных прав, либо когда нам нужно запустить какой-то процесс от имени другого пользователя, например, в целях безопасности.

Например, сейчас мой пользователь не может зайти в директорию /home/user2:
cd /home/user2
потому что у него недостаточно прав. Я могу написать:
su user2
ввести пароль пользователя user2 и стать этим самым вторым пользователем, как видно в начале строки. А дальше смогу зайти в нужную директорию:
cd /home/user2
Чтобы вернуться к моему пользователю, я могу написать:
exit
либо нажать Ctrl+d. Если написать просто:
su root
и ввести пароль рута, можно работать от пользователя root.
Но помните мы разбирали файлы ~/.bash_profile и ~/.bashrc ? Мы писали там переменные и алиасы, и, в случае с ~/.bash_profile, нам нужно было перезалогиниться, а в случае с ~/.bashrc нам достаточно было просто запустить новый эмулятор терминала. То есть ~/.bash_profile это файл настроек для login shell, а ~/.bashrc для nonlogin shell.

Давайте сделаем вот что. У пользователя user2:
su user2
в файле ~/.bash_profile:
nano /home/user2/.bash_profile
создадим переменную test1 равную test1:
а в файле ~/.bashrc:
nano /home/user2/.bashrc
переменную test2 равную test2:

Теперь выйдем — ctrl+d — заново зайдём:
su user2
и посмотрим, как обстоят дела с переменными:
echo $test1 echo $test2
Как видите, сработала настройка только из ~/.bashrc, то есть non-login shell. Это означает, что переменные окружения не прочитались с ~/.bash_profile (login shell) пользователя user2. На самом деле, все переменные остались от предыдущего пользователя. Допустим, если посмотреть переменную PATH:
echo $PATH
можно увидеть пути к директориям /home/user/bin, а это домашняя директория первого пользователя. Также, если писать su user2, можно заметить, что директория, в которой мы находимся, не меняется:

Зачастую нужно, чтобы при логине за другого пользователя поменялось окружение, то есть, чтобы применились настройки из ~/.bash_profile нужного пользователя. Для этого после su следует писать дефис:
su – user2
Теперь у меня есть обе переменные:
echo $test1 echo $test2
то есть считался файл ~/.bash_profile, а значит это был login shell. Также стоит заметить, что при su c дефисом поменялась и директория – раньше мы находились в домашней директории пользователя user, а после «su -» меняется текущая директория — /home/user2.

Кстати, чтобы понять, текущий shell – login или non-login, не обязательно выдумывать каждый раз какие-то проверки с переменными, достаточно проверить значение переменной $0:
echo $0
При non-login shell значение будет просто bash, а при login shell «-bash». И если проверить ту же переменную PATH:
echo $PATH
можно увидеть, что теперь здесь нет пути /home/user/bin, то есть переменные окружения не передались от предыдущего пользователя, а появились как следует.
Так вот, подводя итоги. Когда вы вводите свой логин и пароль, будь то удалённо с помощью ssh, либо локально, зайдя в виртуальный терминал, либо залогинившись в графической оболочке — запускается оболочка со входом — login shell. Это оболочка с авторизацией, она считывает настройки – те же переменные, алиасы, функции сначала с файла /etc/profile, где написано смотреть на файлы в директории /etc/profile.d/ и в файл ~/.bash_profile в домашней директории пользователя. Там также написано смотреть в файл ~/.bashrc в домашней директории пользователя, в котором также написано смотреть в файл /etc/bashrc.
Когда же вы запускаете программу эмулятор терминала, то там нет логина, вы без логина и пароля можете вводить команды — оболочка без входа — non-login shell. В случае с non-login shell сначала считывается файл ~/.bashrc в домашней директории пользователя, затем считывается файл /etc/bashrc, который в свою очередь ссылается на файлы в /etc/profile.d/. Но приведённая схема может отличаться на других дистрибутивах.
Кроме этого, оболочки делятся на interactive и non-interactive. Если вы логинитесь и запускаете команды — это interactive login shell. Если вы работаете в эмуляторе терминала — это interactive non-login shell. Когда работают скрипты, они обычно запускаются без всякого логина — тут уже non-interactive non-login shell. Да, когда вы запускаете эмулятор терминала, в этом эмуляторе запускается bash и запускает ~/.bashrc. Сами по себе ~/.bashrc и ~/.bash_profile — это просто набор команд в одном файле. То есть это скрипты. Когда же вы логинитесь, не важно каким образом, тоже запускается bash, при этом он запускает ~/.bash_profile.

Ладно, со сменой пользователя разобрались. Мы еще говорили, что su позволяет запускать команды от имени другого пользователя. Для этого используется ключ -c. Например:
su user2 -c "touch file" su – user2 -с "touch file"
Подумайте, почему первая команда завершилась с ошибкой, а вторая без? Ну и зачастую, su используют чтобы работать от имени root пользователя, для примера запустим nano от рута:
su - -c "nano /etc/passwd"
и теперь мы можем редактировать файл /etc/passwd и в целом можем делать всё что угодно.

Кстати, если запускать su от имени рута:
su su user2
то никаких паролей не потребуется, root может логиниться кем угодно.
© Copyright 2021, GNU Linux Pro, CC-BY-SA-4.0. Ревизия 5f665cc2 .