В чем различия между «su», «sudo -s», «sudo -i», «sudo su»?


148

Я уже прочитал это из руководства, но я не вижу разницы ..

su - изменить идентификатор пользователя или стать суперпользователем

sudo -s [command]

Опция -s(shell) запускает оболочку, указанную переменной среды SHELL, если она установлена, или оболочку, указанную в passwd (5). Если указана команда, она передается в оболочку для выполнения. В противном случае, интерактивная оболочка выполняется.

sudo -i исчезнуть описание в руководстве


7
Кроме того, не используйте su userдля входа из ненадежных оболочек, но su - user. См. Unix.stackexchange.com/q/7013/8250
Лекенштейн

@Lekensteyn вау, отличный пример. спасибо за LOL :)
törzsmókus

1
всегда помни старую заповедь: не зря корни имени корня!
törzsmókus

Не сказать, что sudo -iэто плохо, но вы, безусловно, можете об этом сказать
Колоб Каньон

Почти дубликаты: askubuntu.com/questions/376199/…
Reinier Post

Ответы:


118

Основное различие между этими командами заключается в том, как они ограничивают доступ к своим функциям.

su (что означает «заменить пользователя» или «переключить пользователя») - делает именно это, запускает другой экземпляр оболочки с привилегиями целевого пользователя. Чтобы убедиться, что у вас есть права для этого, он запрашивает пароль целевого пользователя . Итак, чтобы стать пользователем root, вам нужно знать пароль root. Если на вашем компьютере есть несколько пользователей, которым нужно запускать команды от имени пользователя root, все они должны знать пароль root - учтите, что это будет тот же пароль. Если вам необходимо отозвать права администратора у одного из пользователей, вам нужно изменить пароль пользователя root и сообщить его только тем людям, которым необходимо сохранить доступ - беспорядочно.

sudo (хм ... что за мнемоника? Super-User-DO?) совершенно другая. Он использует файл конфигурации (/ etc / sudoers), в котором указывается, какие пользователи имеют права на определенные действия (запускать команды от имени пользователя root и т. Д.). При вызове запрашивает пароль пользователя, который его запустил, - чтобы убедиться, что пользователь терминал действительно тот же "Джо", который указан в /etc/sudoers. Чтобы отозвать права администратора у человека, вам просто нужно отредактировать файл конфигурации (или удалить пользователя из группы, которая указана в этой конфигурации). Это приводит к намного более чистому управлению привилегиями.

В результате этого во многих системах на основе Debian rootпользователь не имеет установленного пароля - то есть невозможно напрямую войти в систему как root.

Кроме того, /etc/sudoersпозволяет указать некоторые дополнительные параметры - т.е. пользователь X может запускать только программу Y и т. Д.

Часто используемая sudo suкомбинация работает следующим образом: сначала sudoзапрашивает ваш пароль, и, если вам это разрешено, вызывает следующую команду ( su) в качестве суперпользователя. Поскольку suвызывается root, это не требует ввода пароля целевого пользователя. Таким образом, sudo suпозволяет открывать оболочку от имени другого пользователя (включая пользователя root), если /etc/sudoersфайл разрешен для доступа суперпользователя .


2
Я никогда не видел в suкачестве «переключателя пользователя», но всегда был суперпользователем; поведение по умолчанию без чужого имени пользователя (хотя это имеет смысл). Из википедии : «Команда su, также называемая суперпользователем [1] еще в 1974 году, также называлась« замещающий пользователь »,« подмена пользователя »или« установить пользователя », поскольку она позволяет изменять учетную запись, связанную с текущим терминал (окно). "
Доктор Джимбоб

5
@dr jimbob: вы правы, но я обнаружил, что «переключение пользователя» как бы лучше описывает, что он делает, хотя исторически это означает «супер пользователь». Я также рад узнать, что статья в Википедии очень похожа на мой ответ - я никогда раньше не видел эту статью :)
Сергей

11
Официальное значение «su» - «замещающий пользователь». Смотрите: "Ман Су".
Ангел О'Сфера

1
@ AngelO'Sphere: Интересно, что в справочной странице Ubuntu вообще не упоминается «заменитель». На man- странице gnu.org (gnu.org/software/coreutils/manual/html_node/su-invocation.html ) действительно написано «su: Запустить команду с заменой ID пользователя и группы». Я думаю, что gnu.org - канонический источник :)
Сергей

1
Как насчет sudo su?
Каз Вулф

59

sudoпозволяет запускать команды в своей учетной записи пользователя с правами root. suпозволяет вам переключать пользователя, чтобы вы вошли в систему как пользователь root.

sudo -sзапускает оболочку с привилегиями root. sudo -iтакже приобретает среду пользователя root.

Чтобы увидеть разницу между suи sudo -s, сделайте, cd ~а затем pwdпосле каждого из них. В первом случае вы будете в домашнем каталоге root, потому что вы root. Во втором случае вы будете находиться в своем домашнем каталоге, потому что вы сами с правами суперпользователя.

Там больше обсуждения этого вопроса точного здесь .


20
«вы сами с правами суперпользователя» - это не то, что на самом деле происходит :) На самом деле невозможно быть «самим с привилегиями суперпользователя» - либо вы root, либо вы сами. Попробуйте ввести whoami в обоих случаях. Тот факт, что cd ~результаты отличаются, является результатом того, что sudo -s не устанавливает переменную окружения $ HOME.
Сергей

1
@Sergey, whoami, которое он называет «root», потому что вы запускаете cmd «whoami» так, как будто вы его запустили, поэтому временно (на время выполнения этой команды) вы выглядите как пользователь root, но у вас может не быть полного root-доступ в соответствии с файлом sudoers.
Осьминог

1
@Octopus: я пытался сказать, что в Unix процесс может иметь только один UID, и этот UID определяет разрешения процесса. Вы не можете быть «сами с правами суперпользователя», программа запускается либо с вашим UID, либо с UID root (0).
Сергей

5
Что касается «у вас может не быть полного корневого доступа в соответствии с файлом sudoers»: sudoersфайл контролирует, кто может выполнять какую команду от имени другого пользователя, но это происходит до ее выполнения. Однако, если вам было разрешено запустить процесс, скажем, как root - запущенный процесс имеет UID root и имеет полный доступ к системе, sudo не может ограничить это. Опять же, вы всегда либо сами, либо root, здесь нет "половины-половины". Таким образом, если sudoersфайл позволяет вам запускать оболочку от имени root - разрешения в этой оболочке будут неотличимы от «нормальной» корневой оболочки.
Сергей

36

Этот ответ является обманом моего ответа на вопрос об обмане , поставленный здесь на каноническом ответе, чтобы люди могли его найти!

Основное различие между sudo -iи sudo -sявляется:

  • sudo -iдает вам корневую среду, т.е. ваша ~/.bashrcигнорируется.
  • sudo -sдает вам среду пользователя, так что ваш ~/.bashrcуважают.

Вот пример, вы можете видеть, что у меня есть приложение lslв моем ~/.bin/каталоге, которое доступно через, sudo -sно не доступно через sudo -i. Также обратите внимание, что приглашение Bash изменяется как будет с, sudo -iно не с sudo -s:

dotancohen@melancholy:~$ ls .bin
lsl

dotancohen@melancholy:~$ which lsl
/home/dotancohen/.bin/lsl

dotancohen@melancholy:~$ sudo -i

root@melancholy:~# which lsl

root@melancholy:~# exit
logout

dotancohen@melancholy:~$ sudo -s
Sourced .bashrc

dotancohen@melancholy:~$ which lsl
/home/dotancohen/.bin/lsl

dotancohen@melancholy:~$ exit
exit

Хотя sudo -sэто удобно для того, чтобы дать вам знакомую среду, я рекомендую использоватьsudo -i по двум причинам:

  1. Визуальное напоминание о том, что вы находитесь в «корневой» сессии.
  2. Вероятность того, что корневая среда будет отравлена ​​вредоносным ПО, таким как мошенническая линия, гораздо ниже .bashrc.

Я заметил, что sudo -s, похоже, не обрабатывает / etc / profile или что-то, что у меня есть в /etc/profile.d/ .. Есть идеи, почему?
повлиять на

@dotancohen - Что вы подразумеваете под sudo -sпредоставлением среды, с которой знаком пользователь?
мотивировано

@dotancohen - Команда sudo -s уже предоставляет визуальные подсказки, поэтому мне интересно, почему sudo -i является лучшим вариантом.
мотивировано

9

su запрашивает пароль пользователя «root».

sudoзапрашивает ваш собственный пароль (а также проверяет, разрешено ли вам запускать команды от имени пользователя root, что настраивается через /etc/sudoers- по умолчанию все учетные записи пользователей, принадлежащие к группам «admin» или «sudo», могут использовать sudo).

sudo -sзапускает оболочку как root, но не меняет ваш рабочий каталог. sudo -iимитирует вход в систему с учетной записью root: ваша рабочая папка будет /root, а учетная запись root и .profileт. д. будет поступать так же, как при входе в систему.


1
чтобы сделать ответ более полным: sudo -sпочти равно su($ HOME отличается) и sudo -iравноsu -
DJCrashdummy

@DJCrashdummy - Почему вы говорите почти равны? Что отличается?
мотивировано

2

В Ubuntu или аналогичной системе я не нахожу много suсмысла в традиционном смысле для суперпользователя. sudoсправляется с этим делом гораздо лучше. Тем не менее, suотлично подходит для того, чтобы стать другим пользователем в одноразовых ситуациях, когда настройка sudoers была бы глупой.

Например, если я чиню свою систему с живого CD / USB, я часто монтирую свой жесткий диск и другие необходимые вещи chrootв систему. В таком случае моя первая команда, как правило:

su - myuser  # Note the '-'. It means to act as if that user had just logged in.

Таким образом, я работаю не как root, а как обычный пользователь, и затем использую его по sudoмере необходимости.


0
  • su Запрашивает пароль root, становится root, открывает интерактивную оболочку без авторизации.
  • su - Запрашивает пароль root, становится root, открывает интерактивную оболочку входа в систему.

  • sudo -s Запрашивает ваши пароли, становится пользователем root, открывает интерактивную оболочку без авторизации.
  • sudo -i Запрашивает ваши пароли, становится root, открывает интерактивную оболочку входа в систему.

Лучшая практика заключается в использовании этих двух.


  • sudo suЗапрашивает ваш пароль, на секунду становится root и запускается suкак root`.
  • sudo su -Запрашивает ваш пароль, становится root на секунду и запускается su -от имени root.

Так что в этом случае вы suиспользуете, sudoи вам не нужно знать фактический пароль пользователя root. Результаты такие же как suи su -.


В чем разница между логином и без логина?
Pilot6

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