В чем разница между "su", "sudo -s", "sudo -i", "sudo su"?

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

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

sudo -s [command]

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

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

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

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

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

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

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

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

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

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

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

Есть еще одно обсуждение этого точного вопроса здесь.

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

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

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

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

dotancohen@melancholy:~$ ls .binlsldotancohen@melancholy:~$ which lsl/home/dotancohen/.bin/lsldotancohen@melancholy:~$ sudo -iroot@melancholy:~# which lslroot@melancholy:~# exitlogoutdotancohen@melancholy:~$ sudo -sSourced .bashrcdotancohen@melancholy:~$ which lsl/home/dotancohen/.bin/lsldotancohen@melancholy:~$ exitexit

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

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

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

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

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

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

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

Лучше всего использовать две вышеприведенные команды.


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

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

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

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

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

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

Кроме того, не используйте “su user” для входа в систему из ненадежных оболочек, а "su - user`. Видишь linux - Why do we use su - and not just su? - Unix & Linux Stack Exchange

всегда помни старую заповедь: не произноси имени рута всуе!

@Lekensteyn вау, отличный пример. спасибо за LOL :slight_smile:

Не говорю, что “sudo -i” - это плохо, но вы, конечно, можете испортить ситуацию, используя его

Почти дубликат: command line - 'sudo su -' vs 'sudo -i' vs 'sudo /bin/bash' - when does it matter which is used, or does it matter at all? - Ask Ubuntu