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


254

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

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


11
Вы забыли спросить о sudo -sи sudo su.
Раду Радеану




3
@ RaduRădeanu Когда я набрал вопрос, я рассмотрел предложенные вопросы, и никто из них не ответил на мой полный вопрос. То же самое относится и к вопросам, с которыми вы связаны. Хотя они содержат много новой информации для меня, и спасибо за ссылку на них, я обнаружил, что они не настолько полны, как дает ответ хаос пользователя ниже, что намного больше соответствует тому, что я искал.
Пол

Ответы:


325

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

  • su- Команда suиспользуется для переключения на другой пользователь ( ей ведьма у Ser), но вы также можете переключиться на суперпользователь, вызвав команду без параметров. 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'

18
Просто пояснение: sudoпозволяет разрешенному пользователю выполнять команду от имени суперпользователя или другого пользователя . В любом случае +1 за ваши усилия.
Раду Рэдяну

2
@chaos Спасибо за отличный ответ! Он в основном отвечает на мои вопросы, поэтому я пошел дальше и отметил ответ на вопрос, но я не понимаю, когда желательно запускать определенную оболочку. Я действительно использую Ubuntu только через командную строку, и я считаю, что мое наиболее распространенное использование для открытия rootпользовательского сеанса (вместо использования sudo) - это когда я делаю что-то, что требует интенсивного использования rootпривилегий, например, при установке чего-то нового или выполнении основной реконфигурации , Я использовал sudo /bin/bash, но, видимо, этот метод имеет плохой рэп по какой-то причине, которую я не понимаю.
Пол

2
Кроме того, более «правильно» сказать, что su обозначает пользователя-переключателя, а не пользователя-суперпользователя. Т.е. запустить скрипт php: su www-data /usr/share/script.php или просто su www-data для интерактивной оболочки. Но su без имени пользователя создаст учетную запись root (суперпользователя).
Обливиан

Хаос - "shopt -q login_shell && echo 'Оболочка входа в систему' || echo 'Нет оболочки входа в систему'" Подобные предложения я вижу часто, но зачем делать так долго? Оператор && означает, что если код выхода 0, то «выполнить следующую команду», а двойные каналы (||) означают иначе (если не 0), то выполнить эту команду. Так что в основном говорит, что если код выхода 0, то выведите «Shell Login», если код выхода 1 (сбой), то эхо «No login». Почему бы просто "shopt -q login_shell; echo $?" $? означает код результата / выхода предыдущей команды. В большинстве, если не во всех программах, 0 означает успех, 1 или более означает сбой. Так что, если эхо 0 = успех ...
Обливиан

2
@ Пол: sudo -iпредлагается. Читайте здесь: ubuntuforums.org/showthread.php?t=1817402 и здесь: unix.stackexchange.com/questions/98531/…
Марко Сулла,

0

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

Вы можете найти некоторые «небольшие» различия в некоторых критических переменных:

  • PATH, LD_LIBRARY_PATH,LD_PRELOAD

или какая-то разница в ~ /. Обработка точечных файлов ( ~/.config).

Также ~/.xsession.errorsобратите внимание на владение файлами журналов на основе $ HOME ( и т. Д.) Или файлами cookie 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)


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.