'sudo su -' против 'sudo -i' против 'sudo /bin/bash' - когда имеет значение, какой используется, или имеет значение вообще?
Когда я делаю то, что требует, чтобы root набирался десятки раз подряд, я предпочитаю переключать сеанс на сеанс root. В различных уроках и инструкциях, которые я использовал в Интернете, я вижу sudo su
, sudo su -
, sudo -i
а также sudo /bin/bash
используется для открытия корневого сеанса, но мне не ясно, какая разница между ними и когда, или если эта разница имеет значение.
Может кто-нибудь прояснить это для меня?
1 ответ
Чтобы объяснить это, вам нужно знать, что делают программы:
su
- Командаsu
используется для переключения на другого пользователя (с таким именем), но вы также можете переключиться на пользователя root, вызвав команду без параметров.su
запрашивает пароль пользователя для переключения после ввода пароля, который вы переключили в среду пользователя.sudo
-sudo
предназначен для запуска одной команды с привилегиями root. Но в отличие отsu
он запрашивает у вас пароль текущего пользователя. Этот пользователь должен быть в файле sudoers (или в группе, которая находится в файле sudoers). По умолчанию Ubuntu "запоминает" ваш пароль на 15 минут, чтобы вам не приходилось каждый раз вводить пароль.bash
- Текстовый интерфейс для взаимодействия с компьютером. Важно понимать разницу между логином, без входа в систему, интерактивными и неинтерактивными оболочками:
Типы снарядов:
- Оболочка входа в систему: Оболочка входа в систему регистрирует вас в систему как указанный пользователь, для этого необходимо указать имя пользователя и пароль. Когда вы нажимаете Ctrl + Alt + F1 для входа в виртуальный терминал, после успешного входа вы получаете оболочку входа.
- Оболочка без входа в систему: Оболочка, которая выполняется без входа в систему, необходимая для этого - вошедший в систему пользователь. Когда вы открываете графический терминал в gnome, это не входящая в систему оболочка.
- интерактивная оболочка: оболочка (вход в систему или не вход в систему), в которой вы можете интерактивно вводить или прерывать команды. Например терминал гнома.
- неинтерактивная оболочка: (под) оболочка, которая, вероятно, запускается из автоматизированного процесса. Вы не увидите ни ввода, ни вывода.
Итак, случаи:
sudo su
Вызовыsudo
с командойsu
, Bash называется интерактивной оболочкой без авторизации. Так что Bash только выполняет.bashrc
, Вы можете видеть, что после переключения в root вы все еще находитесь в той же директории:user@host:~$ sudo su root@host:/home/user#
sudo su -
На этот раз это оболочка входа в систему, так/etc/profile
,.profile
а также.bashrc
выполняются, и вы окажетесь в домашнем каталоге пользователя root со средой root.sudo -i
Это почти так же, какsudo su -
Опция -i (имитировать начальный вход в систему) запускает оболочку, указанную в записи базы данных паролей целевого пользователя, в качестве оболочки входа в систему. Это означает, что файлы ресурсов для входа в систему, такие как.profile
,.bashrc
или же.login
будет прочитан и выполнен оболочкой.sudo /bin/bash
Это означает, что вы звонитеsudo
с командой/bin/bash
,/bin/bash
запускается как не входящая в систему оболочка, поэтому все точечные файлы не выполняются, но сам bash читает.bashrc
вызывающего пользователя. Ваше окружение остается прежним. Ваш дом не будет домом root. Таким образом, вы являетесь пользователем root, но в среде вызывающего пользователя.sudo -s
читает$SHELL
переменная и выполняет содержимое. Если$SHELL
содержит/bin/bash
это вызываетsudo /bin/bash
(см. выше).
Проверьте:
Чтобы проверить, входите ли вы в оболочку входа или нет (работает только в bash, потому что shopt
это встроенная команда):
shopt -q login_shell && echo 'Login shell' || echo 'No login shell'
Чтобы найти различия, вы можете разбить полученную среду на разные вызовы.
Вы можете найти некоторые "небольшие" различия в некоторых критических переменных:
PATH
,LD_LIBRARY_PATH
,LD_PRELOAD
или какая-то разница в ~/. Работа с точечными файлами (~/.config
).
Рассмотрим также владение файлами журналов на основе $HOME (~/.xsession.errors
и т. д.) или файлы Xauth (~/.Xauthority
), которые генерируют команды.
Попробуйте эти команды:
# 'su -' vs 'su'
diff <(sudo su - -c env | sort) <(sudo su -c env | sort)
# 'su -' vs 'sudo -i'
diff <(sudo su - -c env | sort) <(sudo -i env | sort)