'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)


Другие вопросы по тегам