суббота, 16 июня 2018 г.

Разница между su, su -, sudo -i, sudo -s

Промучавшись полдня с настройкой Hashicorp Vault до меня никак не могло дойти, что я делаю не так, ведь по сути ничего супер сложного там нет, однако я сталкивался с множеством ошибок при попытке запуска Vault-сервера.

Для получения прав рута на сервере я обычно использую команду sudo -s, почему именно ее — точно не вспомню, просто исторически сложилось и каких-либо проблем по этому поводу не испытывал.

Как оказалось, моя ошибка при настройке Vault была именно в том, что рута я получал именно такой командой.
Вот что пишут в мане:
-s, --shell Run the shell specified by the SHELL environment variable if it is set or the shell specified by the invoking user's password database entry. If a command is specified, it is passed to the shell for execution via the shell's -c option. If no command is specified, an interactive shell is executed.

Команда запускает shell из-под рута без смены директории, при этом не импортируются переменные окружения, которые прописаны например в .bash_profile или .login.

В случае sudo -i совсем другая история:
-i, --login Run the shell specified by the target user's password database entry as a login shell. This means that login-specific resource files such as .profile or .login will be read by the shell. If a command is specified, it is passed to the shell for execution via the shell's -c option. If no command is specified, an interactive shell is executed. sudo attempts to change to that user's home directory before running the shell. The command is run with an environment similar to the one a user would receive at log in. The Command environment section in the sudoers(5) manual documents how the -i option affects the environment in which a command is run when the sudoers policy is in use.

Тут запускается shell со сменой директории пользователя и импортом переменных окружения.

В случае su и su - тоже есть разница.
su - в этом случае сначала переключается пользователь, а затем вызывается shell, то есть очищая все переменные окружения и запуская чистую сессию рута.
su не очищает переменные окружения, а просто переключает пользователя оставляя переменные окружения старого пользователя.

Комментариев нет: