При этом su
вы становитесь другим пользователем - по умолчанию root, но потенциально другим пользователем. Если вы говорите su -
, ваша среда также заменяется средой входа этого пользователя, так что то, что вы видите, неотличимо от входа в систему от имени этого пользователя. Система не может сказать, что вы делаете в то время, как вы выполняете su
действия другого пользователя при входе в систему.
Вещи очень разные с sudo
:
Команды, которые вы запускаете через sudo
execute как целевой пользователь - по умолчанию root, но изменяемые с помощью -u
- но он регистрирует команды, которые вы выполняете через него, помечая их своим именем пользователя, чтобы потом можно было назначить вину. :)
sudo
очень гибкий. Например, вы можете ограничить количество команд, которые могут выполнять данный пользователь или группа пользователей. С su
этим все или ничего.
Эта функция обычно используется для определения ролей. Например, вы могли бы определить группу «резервных копий», которую разрешено запускать, dump
и для tar
каждой из которых необходим root-доступ для правильного резервного копирования системного диска.
Я упоминаю об этом здесь, потому что это означает, что вы можете дать кому-то sudo
привилегии, не давая им sudo -s
или sudo bash
способностям. У них есть только те разрешения, которые им необходимы для выполнения своей работы, в то время как su
у них запущена вся система. Вы должны быть осторожны с этим, хотя: если вы даете кому-то возможность сказать sudo vi
, например, они могут вырваться vi
и эффективно иметь ту же силу, что и с sudo -s
.
Поскольку он принимает пароль пользователя sudoer вместо пароля root, sudo
изолирует разрешение между несколькими пользователями sudoer.
Это решает административную проблему su
, заключающуюся в том, что при смене пароля root нужно было сообщить всем, кто должен был его знать su
. sudo
позволяет пароли sudoers изменить самостоятельно. Фактически, это обычная блокировка паролем учетной записи пользователя root в системе, с помощью которой sudo
все задачи sysadmin должны выполняться через нее sudo
. В большой организации со многими доверенными пользователями sudo это означает, что когда один из системных администраторов уходит, вам не нужно менять пароль root и распространять его среди оставшихся администраторов.
Основное различие между sudo bash
и sudo -s
заключается в том, что -s
он короче и позволяет передавать команды для выполнения в стандартной оболочке вашего пользователя двумя способами:
Вы можете сказать, sudo -s some-command
что работает some-command
под вашей оболочкой. Это в основном сокращение для sudo $SHELL -c some-command
.
Вместо этого вы можете передавать команды на стандартный ввод оболочки, например sudo -s < my-shell-script
. Вы можете использовать это с помощью heredoc для отправки нескольких команд на один sudo
вызов, избегая необходимости sudo
повторного ввода .
Оба эти поведения являются необязательными. Чаще всего вы даете в -s
одиночку, поэтому он просто запускает оболочку вашего пользователя в интерактивном режиме. В этом режиме он отличается sudo bash
тем, что может запускать другую оболочку, отличную от той, которая выполняется bash
сначала в SHELL
переменной среды, а затем, если она не установлена, в настройках оболочки входа пользователя, обычно в /etc/passwd
.
Оболочка, запущенная пользователем, sudo -s
наследует вашу текущую пользовательскую среду. Если то, что вы действительно хотите, это чистая среда, как вы получаете сразу после входа в систему, то, что вы хотите вместо этого sudo -i
, является относительно недавним дополнением к sudo
. Грубо говоря, sudo -i
это sudo -s
как su -
есть su
: он сбрасывает все, кроме нескольких ключевых переменных среды, и отправляет вас обратно в домашний каталог вашего пользователя. Если вы также не дадите ей команды для запуска под этой оболочкой через стандартный ввод или sudo -i some-command
, она запустит эту оболочку как интерактивную оболочку входа в систему, так что сценарии запуска оболочки вашего пользователя (например .bash_profile
) будут запущены снова.
Все это делает sudo -i
значительно более безопасным, чем sudo -s
. Почему? Потому что если кто-то может изменить вашу среду раньше sudo -s
, это может привести к выполнению непреднамеренных команд. Наиболее очевидный случай - это модификация SHELL
, но она также может происходить реже, например, через, PAGER
если вы говорите, man foo
находясь под sudo -s
.
Вы можете сказать: «Если они могут изменить PAGER
, они могут изменить PATH
, и тогда они могут просто заменить злую sudo
программу», но кто-то достаточно параноик может сказать, /usr/bin/sudo /bin/bash
чтобы избежать этой ловушки. Вы, вероятно, не настолько параноик, что вы также избегаете ловушек во всех других восприимчивых переменных окружения. Вы также не забыли проверить EDITOR
, например, перед выполнением любой команды VCS ? Таким образом sudo -i
.
Поскольку sudo -i
ваш рабочий каталог также изменяется на домашний каталог вашего пользователя, вы все равно можете использовать его sudo -s
в тех ситуациях, когда вы знаете, что хотите остаться в том же каталоге, в котором находились cd
при запуске sudo
. Это все еще безопаснее sudo -i
и cd
обратно туда, где вы были, хотя.
sudo su -
этот способ, вам не нужен пароль root, и он-
гарантирует, что домашний каталог установлен правильно.