В чем разница между следующими командами:
su
sudo -s
sudo -i
sudo bash
Я знаю, что su
мне нужно знать пароль root, и sudo
я должен находиться в sudoers
файле, но в чем разница после его выполнения?
Я знаю, что есть разница между su
и , sudo -s
потому что мой домашний каталог находится /root
после того, как я выполняю su
, но мой домашний каталог все еще находится /home/myname
после sudo -s
. Но я подозреваю, что это всего лишь симптом глубинного различия, которое я упускаю.
решение1
С su
тобойстановитьсядругой пользователь — root по умолчанию, но потенциально другой пользователь. Если вы говорите su -
, ваша среда также заменяется средой входа этого пользователя, так что то, что вы видите, неотличимо от входа в качестве этого пользователя. Система никак не может отличить то, что вы делаете, когда su
'd другому пользователю, от действий этого пользователя при входе в систему.
Совсем по-другому обстоят дела с sudo
:
Команды, которые вы запускаете
sudo
выполнятькак целевой пользователь — root по умолчанию, но его можно изменить-u
— но он регистрирует команды, которые вы через него запускаете, помечая их вашим именем пользователя, чтобы впоследствии можно было назначить виновного. :)sudo
очень гибок. Например, вы можете ограничить команды, которые разрешено запускать определенному пользователю или группе пользователей. Сsu
, это все или ничего.Эта функция обычно используется для определения ролей. Например, вы можете определить группу "резервное копирование", которой разрешено запускать
dump
иtar
, каждой из которых требуется доступ root для надлежащего резервного копирования системного диска.Я упоминаю об этом здесь, потому что это означает, что вы можете дать кому-то
sudo
привилегии, не давая емуsudo -s
илиsudo bash
способностям. У них есть только разрешения, необходимые для выполнения их работы, тогда как сsu
они управляют всей системой. Однако с этим нужно быть осторожным: если вы даете кому-то возможность сказатьsudo vi
, например, он может раскошелитьсяvi
и фактически иметь ту же власть, что и сsudo -s
.Поскольку вместо пароля root используется пароль пользователя sudoer,
sudo
разрешения между несколькими пользователями sudoer разграничиваются.Это решает административную проблему с
su
, которая заключается в том, что при изменении пароля root, всем тем, кто должен был его знать, чтобы использовать,su
нужно было сообщить об этом.sudo
позволяет паролям sudoers изменяться независимо. Фактически, обычно учетная запись пользователя root блокируется паролем в системе с ,sudo
чтобы заставить все задачи системного администратора выполняться черезsudo
. В большой организации с большим количеством доверенных sudoers это означает, что когда один из системных администраторов уходит, вам не нужно менять пароль root и передавать его тем администраторам, которые остаются.
Основные различия между sudo bash
и sudo -s
заключаются в следующем:
-s
короче, чемbash
Вы можете сказать,
sudo -s some-command
чтобы запуститьsome-command
под вашей оболочкой по умолчанию, но с привилегиями суперпользователя. Это в основном сокращение дляsudo $SHELL -c some-command
.Вместо этого вы можете передавать команды на стандартный ввод оболочки, например
sudo -s < my-shell-script
. Вы можете использовать это схередокдля отправки нескольких команд за одинsudo
вызов, избегая необходимости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
while under sudo -s
.
Вы можете сказать: «Если они могут изменить PAGER
, они могут изменить PATH
, а затем они могут просто заменить вредоносную sudo
программу», но кто-то достаточно параноидальный может сказать, /usr/bin/sudo /bin/bash
чтобы избежать этой ловушки. Вы, вероятно, не настолько параноидальный, чтобы также избегать ловушек во всехдругойХотя восприимчивые переменные окружения. Вы также не забыли проверить EDITOR
, например, перед запуском любогоВКСкоманда? Таким образом sudo -i
.
Поскольку sudo -i
также изменяет ваш рабочий каталог на домашний каталог пользователя, вы все равно можете использовать его sudo -s
в тех ситуациях, когда вы знаете, что хотите остаться в том же каталоге, cd
в который вы попали, когда запустили sudo
. Хотя все равно безопаснее sudo -i
вернуться cd
туда, где вы были.
Другой вариант всего этого, который вы иногда видите, это sudo su
, что приблизительно эквивалентно sudo -s
. Аналогично, sudo su -
функционально довольно близко к sudo -i
. Поскольку sudo
и su
являются конкурирующими командами, немного странно объединять их таким образом, поэтому я рекомендую вам использовать флаги sudo
вместо этого.
решение2
Изсообщение на ubuntuforumsЯ сделал некоторое время назад:
Рассмотрим следующий эксперимент:
applic@ion:~% sudo su
[sudo] password for applic:
root@ion:/home/applic# env > /tmp/sudo_su_env
root@ion:/home/applic# exit
exit
applic@ion:~% sudo -s
applic .bashrc read...
root@ion:~% env >/tmp/sudo_s
Вот какие различия я обнаружил:
С sudo -s
:
HOME=/home/applic
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
reads $USER's ~/.bashrc
С sudo su
:
HOME=/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
reads /etc/environment
reads /root/.bashrc
Обратите внимание на разницу в $HOME
. Быть root и установить $HOME
домашний каталог обычного пользователя может вызвать проблемы. Например, если вы запустите графическое приложение, обычный пользователь ~/.Xauthority
может быть перезаписан root. Это впоследствии вызовет проблемы обычного пользователя, такие как невозможность запустить определенные графические приложения через cron.
Обобщить:
corrupted by user's
HOME=/root uses root's PATH env vars
sudo -i Y Y[2] N
sudo -s N Y[2] Y
sudo bash N Y[2] Y
sudo su Y N[1] Y
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
вероятно, установлен/etc/environment
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
Суть в том, что sudo -i
это правильная команда, которую следует запускать, когда вам нужна оболочка root, не испорченная средой пользователя.
решение3
su
(сведьматысер илисзаменительтыser) позволяет вам переключать пользователя. su
по сути запускает другой экземпляр оболочки с привилегиями предполагаемого пользователя. По умолчанию он переключает вас на пользователя root
, если мы хотим переключить конкретного пользователя, нам нужно передать пользователя следующим образом:
$ su bob # switches to bob (requires bob's password)
su -
означает, что переменные среды будут сброшены до значений root и su
означают переменные среды старого пользователя.
например: домашний каталог пользователя root, если вы используете, su -
или старый домашний каталог пользователя, если вы используете su
.
судо (свверхтысерделать) — это утилита командной строки, которая позволяет пользователям запускать программы с привилегиями безопасности другого пользователя, по умолчанию — суперпользователя, т.е. root
. Она использует файл конфигурации /etc/sudoers
, в котором перечислены пользователи, имеющие права на определенные действия
sudo следует читать как/ˈsuːduː/. синтаксис sudo command
т.е.сведьматысер иделатьэта команда.
su
эквивалентноsudo -i
и имитирует вход в учетную запись root. Ваш рабочий каталог будет/root
, и он будет читать root's.profile
и т. д. Приглашение изменится с $ на #, указывая на то, что у вас есть доступ root.sudo -s
запускает оболочку от имени пользователя root, но не меняет рабочий каталог.sudo bash
гдеbash
команда для запускаsudo
. Эта команда запускаетсяbash
от имени суперпользователя.- Используя его,
sudo
можно регистрировать все, что кто-то делает. - Использование
sudo
избавляет пользователя от необходимости знать пароль root. - Используя
sudo
мы можем ограничить команды, которые разрешено запускать.