Вопрос 'sudo su -' vs 'sudo -i' vs 'sudo / bin / bash' - когда имеет значение, что используется, или это имеет значение вообще?


Когда я делаю то, что требует, чтобы root вводился десятками раз подряд, я предпочитаю переключать сеанс на корневую сессию. В различных учебниках и инструкциях, которые я использовал в Интернете, я вижу sudo su, sudo su -, sudo -i а также sudo /bin/bash используется для открытия корневой сессии, но я не понимаю разницы между этими и когда, или если эта разница имеет значение.

Может кто-нибудь прояснить это для меня?


196
2017-11-12 23:30


происхождения


Вы забыли спросить о sudo -s а также sudo su, - Radu Rădeanu
Связанный: Разница между «su», «sudo -s», «sudo -i» - Radu Rădeanu
Связанный: В чем разница между командами «sudo» и «sudo sh»? - Radu Rădeanu
Связанный: Какова функциональная разница между sudo su и sudo -i? - Radu Rădeanu
@ RaduRădeanu Когда я набрал вопрос, я рассмотрел предложенные вопросы, и ни один из них действительно не затронул мой полный вопрос. То же самое касается вопросов, с которыми вы связаны. Хотя они содержат много новой информации для меня, и спасибо вам за ссылку на них, я нашел их не такими полными, как приведенный ниже пользовательский хаос, что намного больше соответствует тому, что я искал. - Paul


ответы:


Чтобы объяснить это, вам нужно знать, что делают программы:

su - Команда su используется для переключения на другого пользователя (s ведьма U ser), но вы также можете переключиться на пользователя root, вызывая команду без параметров. su запрашивает пароль пользователя для переключения после ввода пароля, который вы переключили в среду пользователя.

sudo - sudo предназначен для запуска единой команды с привилегиями root. Но в отличие от su он запрашивает пароль для текущего пользователя. Этот пользователь должен находиться в файле sudoers (или группе, находящейся в файле sudoers). По умолчанию Ubuntu «запоминает» ваш пароль в течение 15 минут, так что вам не нужно вводить пароль каждый раз.

bash - Текстовый интерфейс для взаимодействия с компьютером. Важно понимать разницу между входами, недействительными, интерактивными и неинтерактивными оболочками:

  • login shell: оболочка входа регистрирует вас в системе в качестве указанного пользователя, необходимой для этого имени пользователя и пароля. Когда вы попадаете Ctrl+альт+F1 для входа в виртуальный терминал, который вы получаете после успешного входа в систему для входа в систему.
  • non-login shell: оболочка, которая выполняется без входа в систему, необходимая для этого является зарегистрированным пользователем. Когда вы открываете графический терминал в gnome, это оболочка без входа.
  • интерактивная оболочка: оболочка (логин или не-логин), где вы можете интерактивно вводить или прерывать команды. Например, терминал gnome.
  • неинтерактивная оболочка: оболочка (суб), которая, вероятно, запускается из автоматизированного процесса. Вы не увидите ни ввода, ни вывода.

sudo su Вызовы sudo с командой su, Bash называется интерактивной оболочкой без входа. Так что bash выполняется только .bashrc, Вы можете видеть, что после переключения на root вы все еще находитесь в одном каталоге:

user@host:~$ sudo su
root@host:/home/user#

sudo su - На этот раз это оболочка входа, поэтому /etc/profile, .profile а также .bashrc выполняются, и вы окажетесь в домашнем каталоге root с корневой средой.

sudo -i Это почти то же самое, что и sudo su - Параметр -i (имитировать начальный логин) запускает оболочку, указанную в записи базы данных пароля целевого пользователя в качестве оболочки входа. Это означает, что файлы ресурсов для входа в систему, такие как .profile, .bashrc или .login будет считываться и выполняться оболочкой.

sudo /bin/bash Это означает, что вы звоните sudo с командой /bin/bash, /bin/bash запускается как недействительная оболочка, поэтому все точечные файлы не выполняются, но сам bash читает .bashrc вызывающего пользователя. Ваша среда остается прежней. Ваш дом не будет корневым домом. Таким образом, вы являетесь пользователем root, но в среде вызывающего пользователя.

sudo -sчитает $SHELL переменная и выполняет содержимое. Если $SHELL содержит /bin/bash он вызывает sudo /bin/bash (см. выше).

Проверьте: Чтобы проверить, находитесь ли вы в оболочке входа или нет (работает только в bash, потому что shopt это встроенная команда):

shopt -q login_shell && echo 'Login shell' || echo 'No login shell'

258
2017-11-13 09:43



Просто разъяснение: sudo позволяет разрешенному пользователю выполнять команду в качестве суперпользователя или другого пользователя, Во всяком случае, +1 для ваших усилий. - Radu Rădeanu
@chaos Спасибо за отличный ответ! Это в основном отвечает на мои вопросы, поэтому я пошел дальше и отметил, что вопрос ответил, но я не понимаю, когда желательно запускать определенную оболочку. Я действительно использую только Ubuntu через командную строку, и я нахожу свое наиболее распространенное использование для открытия root сеанс пользователя (по сравнению с использованием sudo), когда я делаю то, что требует интенсивного использования root привилегии, например, при установке чего-либо нового или выполнении основной реконфигурации. Я использую sudo /bin/bash, но, видимо, у этого метода плохой рэп почему-то я не понимаю. - Paul
Кроме того, более «правильно» сказать, что su означает пользователя-коммутатора, а не суперпользователя. То есть запустите php-скрипт: su www-data /usr/share/script.php или просто su www-data для интерактивной оболочки. Но su без имени пользователя будет использовать учетную запись root (суперпользователя). - oblivian
Chaos - "shopt -q login_shell && echo 'Входная оболочка' || echo 'Нет оболочки для входа'. Такие предложения я часто вижу, но почему это так долго? Оператор && означает, что если код выхода 0, то «выполните следующую команду», а двойные каналы (||) означают else (если не 0), то выполните эту команду. Итак, что это в основном говорит, если код выхода 0, то echo «Входная оболочка», если код выхода 1 (сбой), то эхо «Нет входа». Почему бы не просто «shopt -q login_shell; echo $?» $? означает код результата / выхода предыдущей команды. В большинстве, если не все программы 0 означает успех, 1 или более означает отказ. Итак, если эхо 0 = успех ... - oblivian
@Павел: sudo -i . Читайте здесь: ubuntuforums.org/showthread.php?t=1817402 и здесь: unix.stackexchange.com/questions/98531/... - Marco Sulla