Когда я делаю то, что требует, чтобы root набирался десятки раз подряд, я предпочитаю переключать сеанс на сеанс root. В различных учебных пособиях и инструкциях, которые я использовал в Интернете, я вижу, что sudo su
, sudo su -
, sudo -i
и sudo /bin/bash
используются для открытия корневого сеанса, но мне не ясно, в чем разница между ними и когда или если это различие имеет значение.
Может кто-нибудь прояснить это для меня?
Чтобы объяснить это, вам нужно знать, что делают программы:
su
- Команда su
используется для переключения на другого пользователя ( с ведьма u ser), но вы также можете переключиться на пользователя root, вызвав команду без параметров. su
запрашивает пароль пользователя для переключения после ввода пароля, который вы переключили в среду пользователя. sudo
- sudo
предназначены для запуска одной команды с привилегиями root. Но в отличие от su
он запрашивает у вас пароль текущего пользователя. Этот пользователь должен быть в файле sudoers (или в группе, которая находится в файле sudoers). По умолчанию Ubuntu «запоминает» ваш пароль на 15 минут, чтобы вам не приходилось каждый раз вводить пароль. bash
- текстовый интерфейс для взаимодействия с компьютером. Важно понимать разницу между входящими в систему, не входящими в систему, интерактивными и неинтерактивными оболочками: Типы оболочек:
Возможны следующие случаи:
sudo su
Вызовы sudo
с командой su
. Bash называется интерактивной оболочкой без авторизации. Так что bash выполняется только .bashrc
. Вы можете видеть, что после переключения в root вы все еще находитесь в той же директории:
user@host:~$ sudo su
root@host:/home/user#
sudo su -
На этот раз это оболочка входа в систему, поэтому /etc/profile
, .profile
и .bashrc
будут выполнены, и вы окажетесь в домашнем каталоге root с окружением root.
.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
или некоторое различие в ~/. dotfiles, обрабатывающий (~/.config
).
Считают также владение $HOME базирующимся logfiles (~/.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)