Различия между Su, Sudo Su, Sudo -s и Sudo -i

Существует много различных способов получить root-сессию в терминале Linux. Это может вызвать путаницу, так как большинство начинающих пользователей, которые стремятся получить права суперпользователя, могут не знать, как каждая команда может получить доступ к root, в чем их различия и когда эти различия важны. Здесь мы разбираем каждую из множества команд, используемых для получения доступа к root в терминале, объясняем, как они получают root, когда их использовать и все, что между ними.
Содержание
- su
- su -c
- sudo su
- sudo -i
- sudo -s
- Часто задаваемые вопросы
Также читайте: Что такое Doas и как его установить
su
Команда su заменяет текущего пользователя на root в текущей оболочке.
Вы можете переключиться на любого пользователя, введя su и добавив после него имя пользователя.
Это скажет системе переключиться (и фактически выйти) с текущего пользователя на указанного. В качестве альтернативы команда su может получить доступ к root, введя su без указания чего-либо после команды.
su лучше всего использовать, когда пользователь хочет получить прямой доступ к учётной записи root в системе. Это не проходит через sudo или что-то подобное. Вместо этого вас просят ввести пароль пользователя root, так как вы фактически входите в систему. Более того, другие способы получения доступа к root не имеют преимущества, заключающегося в получении доступа к домашнему каталогу и окружению root.
Предупреждение: использование su — наименее безопасный способ выполнения действий от имени root. Обычно, если вы можете его избегать, не используйте его.
Также читайте: Полное руководство по командам Apt и Apt-Get
su -c
Эта команда непосредственно передает другие команды пользователю root.

Аналогично тому, как вы вводите sudo перед командой, su -c выполнит команду от имени пользователя root. Однако вместо того, чтобы просто вводить команду, вам придется заключить её в кавычки.
Это быстрый способ выполнения одной команды через ваш терминал с повышенными привилегиями. Это очень полезно, если sudo по какой-то причине недоступен (он не предустановлен в дистрибутивах, таких как Arch Linux) или не работает должным образом из-за повреждения.
Поскольку вы передаете что-то непосредственно root, если ваши пароли пользователя и root разные, вам придется ввести пароль root для аутентификации.
sudo su
Эта команда запрашивает пароль текущего пользователя, а не root.
Это по сути то же самое, что просто запустить su в оболочке, за исключением одного важного отличия: вместо того, чтобы говорить системе «переключить пользователей» напрямую, вы говорите ей запустить команду su с привилегиями суперпользователя. Когда запускается sudo su, будут запущены «.profile», «.bashrc» и «/etc/profile», аналогично запуску su (или su root). Если какой-либо команды запускается с sudo перед ней, она получает привилегии root.
Хотя нет большой разницы между sudo su и su, первая команда все же очень полезна по одной важной причине: когда пользователь запускает su, чтобы получить доступ к root на системе, он должен знать пароль root. Root предоставляется с помощью sudo su, запрашивая пароль текущего пользователя, что делает возможным получение root без пароля root.
Это полезно в ситуациях, когда вы, возможно, забыли пароль root, если он отличается от пароля вашей учетной записи. Хотя вы можете сделать это в это время, вам все же следует сбросить пароль root в какой-то момент.
Также читайте: Как использовать команду Rm в Linux
sudo -i
Использование sudo -i практически то же самое, что и команда sudo su с одним исключением: оно не взаимодействует напрямую с пользователем root.
Подобно sudo su, флаг -i позволяет пользователю получить окружение root, не зная пароля учетной записи root. sudo -i также очень похоже на использование sudo su: оно прочитает все файлы окружения («.profile» и т. д.) и установит окружение внутри оболочки.
Его отличие от sudo su заключается в том, что sudo -i является гораздо более чистым способом получения root и окружения root без прямого взаимодействия с пользователем root.
Чтобы прояснить: с помощью sudo su вы используете более одного корневого setuid комманда в фоне. Это делает гораздо более сложным выяснение, какие переменные окружения будут сохранены, а какие будут изменены (при переключении на окружение root). Это не так с sudo -i. Из-за этого большинство людей считают это предпочтительным методом получения root без прямого входа.
Проще говоря: sudo -i даст вам «чистый» вход в root в вашей папке «/root», которая является «домашней» папкой для пользователя root.
Также читайте: Как использовать команду dd в Linux
sudo -s
Эта команда вызывает оболочку с вашей переменной $SHELL.
Флаг -s для команды sudo читает переменную $SHELL текущего пользователя, выполняющего команды. Эта команда работает так, как если бы пользователь запускал sudo /bin/bash, если оболочка, из которой пользователь пришел, является bash.
В нашем случае sudo -s предоставил нам интерактивную оболочку fish, так как мы ранее установили fish в качестве нашей главной оболочки, так что это будет так, как если бы мы выполнили sudo /usr/bin/fish.

Sudo -s является оболочкой «без входа». В отличие от команды, такой как sudo -i или sudo su, система не будет читать никаких файлов окружения. Когда пользователь говорит оболочке запустить sudo -s, он получает root, но не изменяет окружение пользователя. Ваш домашний каталог не станет домом root и т. д.

Эта команда лучше всего использовать, когда пользователь хочет переключиться на root, но сохранить ту же оболочку окружения. Например, вы можете захотеть запустить скрипт fish и не быть вынужденным использовать оболочку bash по умолчанию, которую часто получает root в большинстве дистрибутивов.
Другие команды, упомянутые выше, получают доступ к root, но также предоставляют вам оболочку и переменные окружения, которые дистрибутив имеет для root. Возможно, вы просто хотите переключиться на пользователя без всего этого багажа!
Также читайте: Основные команды Bash для новичков в Linux
Часто задаваемые вопросы
Почему оболочка, в которой я работаю, имеет значение?
Если вы используете немодифицированную оболочку bash для вашей учетной записи, разница в основном философская. В большинстве случаев повышение привилегий до root через любую оболочку не приведет к заметным изменениям. Но если вы используете что-то другое, вы сразу заметите, насколько могут различаться вещи!
Например, скажем, вы используете оболочку fish для вашей учетной записи и оставляете оболочку root в bash. Загрузка оболочки пользователя, используя sudo -s, дает совершенно другой результат.
Оболочка будет следовать той конфигурации, которую вы имеете в домашней папке root. Если у вас нет такой конфигурации, она просто загрузит конфигурацию по умолчанию вместо вашей личной. (В нашем случае это будет «~/.config/fish/config.fish».) Для всех намерений и целей лучше оставить все так, а не копировать пользовательскую конфигурацию в «/root».
Смена на оболочку вашей учетной записи пользователя при переключении на root должна выполняться только в том случае, если вам нужно запустить скрипт, который абсолютно требует этой конкретной оболочки.
Может ли доступ к root навредить моей системе?
В некоторых случаях да. Если вы не уверены, что вам нужно получить доступ к root для всего в определенной сессии терминала, часто лучше просто ввести sudo и затем команду, если вы хотите получить доступ к root для этой конкретной команды. Например, ввод команды sudo apt install vlc в любой версии Linux на базе Debian скажет операционной системе получить доступ к root только для выполнения менеджера пакетов APT для установки VLC.
Одним очень важным ограничением выполнения sudo -i или любого другого варианта, о котором мы говорили ранее, по сравнению с вводом sudo перед каждой командой, которую вы хотите выполнить от имени root, является то, что первая команда не записывает вашу историю команд в «/var/log/auth.log». Если вы допустите ошибку, вы не сможете вернуться и проверить, что вы сделали, чтобы исправить это. Вам придется действовать на память, так как сессии root не регистрируются.
Когда я ввожу «sudo» перед командой, какой вариант «sudo su» я запускаю?
Вводя sudo для выполнения команды (т. е. вы вводите его в той же строке, что и команда, которую хотите выполнить), вы по сути запускаете ее в интерактивной оболочке root. Это то, что делает команда sudo -s как самостоятельная команда. Она также очень похожа на запуск команды su -c.
Все скриншоты принадлежат Мигелю Лейва-Гомесу.