su против sudo -s против sudo -i против sudo bash

su против sudo -s против sudo -i против sudo bash

В чем разница между следующими командами:

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заключаются в следующем:

  1. -sкороче, чемbash

  2. Вы можете сказать, sudo -s some-commandчтобы запустить some-commandпод вашей оболочкой по умолчанию, но с привилегиями суперпользователя. Это в основном сокращение для sudo $SHELL -c some-command.

  3. Вместо этого вы можете передавать команды на стандартный ввод оболочки, например sudo -s < my-shell-script. Вы можете использовать это схередокдля отправки нескольких команд за один sudoвызов, избегая необходимости sudoмногократного ввода.

  4. Даже без этих дополнительных аргументов команды, она 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 foowhile 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
  1. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games вероятно, установлен/etc/environment
  2. 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мы можем ограничить команды, которые разрешено запускать.

Связанный контент