su vs sudo -s vs sudo -i vs sudo bash


89

Яка різниця між наступними командами:

su
sudo -s
sudo -i
sudo bash

Я знаю, що suмені потрібно знати корінний пароль, і sudoя маю бути у sudoersфайлі, але як тільки виконується, що таке різниця?

Я знаю , що є різниця між suі sudo -sтому , що мій домашній каталог /rootпісля того як я виконати su, але мій домашній каталог ще /home/mynameпісля sudo -s. Але я підозрюю, що це лише симптом основної різниці, яку мені не вистачає.


3
Я вважаю за краще використовувати sudo su - цей спосіб, вам не потрібен пароль root, і -переконайтеся, що домашній каталог встановлений правильно.
Єнс Тіммерман

Відповіді:


114

З su, ви стаєте іншим користувачем - root за замовчуванням, але, можливо, іншим користувачем. Якщо ви скажете su -, ваше середовище також заміняється середовищем входу цього користувача, так що те, що ви бачите, не відрізняється від входу в систему як цього користувача. У жодному разі система не може визначити, що ви робите, коли ви робите suінший користувач від дій цього користувача під час входу.

Все дуже відрізняється sudo:

  • Команди, які ви запускаєте через sudo Execute як цільового користувача - root за замовчуванням, але змінні на -u-, але вони реєструють команди, які ви запускаєте через нього, позначаючи їх своїм іменем користувача, тому винність може бути призначена згодом. :)

  • sudoдуже гнучка. Ви можете обмежити команди, наприклад, для певного користувача або групи користувачів, які можуть працювати, наприклад. З su, це все або нічого.

    Ця функція зазвичай використовується для визначення ролей. Наприклад, ви можете визначити групу "резервних копій", яку можна запускати, dumpі tarкожна з яких потребує кореневого доступу для належного резервного копіювання системного диска.

    Я згадую це тут, тому що це означає, що ви можете надати комусь sudoпривілеї, не надаючи їм sudo -sчи sudo bashздібностей. У них є лише ті дозволи, які вони потребують, щоб виконувати свою роботу, тоді як suвони працювали над усією системою. Однак ви повинні бути обережнішими з цим: якщо ви, наприклад, даєте комусь можливість сказати sudo vi, він може вистрілити з нього viі мати фактично таку ж силу, як і з sudo -s.

  • Оскільки він приймає пароль судора замість кореневого пароля, sudoізолює дозвіл між декількома судорами.

    Це вирішує адміністративну проблему su, яка полягає в тому, що при зміні пароля root suпотрібно сказати всім, хто мав це знати . sudoдозволяє паролі sudoers змінюватись самостійно. Насправді, звичайним є блокування паролем облікового запису користувача в системі, sudoщоб змусити всі завдання sysadmin виконувати через sudo. У великій організації з багатьма надійними судорами це означає, що коли один із системних адміністраторів виїжджає, вам не доведеться змінювати кореневий пароль і поширювати його тим адміністраторам, які залишаються.

Основна відмінність між sudo bashі в sudo -sтому, що -sце коротше, і дозволяє передавати команди для виконання в оболонці користувача за допомогою двох способів:

  1. Ви можете сказати, sudo -s some-commandщо працює some-commandпід вашою оболонкою. В основному це скорочення sudo $SHELL -c some-command.

  2. Ви можете замість цього передати команди на стандартний вхід оболонки, наприклад sudo -s < my-shell-script. Ви можете використовувати це з heredoc для надсилання декількох команд на один 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під час " sudo -s.

Ви можете сказати: "Якщо вони можуть змінювати PAGER, вони можуть змінювати PATH, і тоді вони можуть просто замінити злу sudoпрограму", але хтось достатньо параноїд може сказати, /usr/bin/sudo /bin/bashщоб уникнути цієї пастки. Ви, мабуть, не такі параноїчні, що також уникаєте пасток у всіх інших чутливих змінних середовища. Ви також пам’ятали перевірити EDITOR, наприклад, перед запуском будь-якої команди VCS ? Таким чином sudo -i.

Оскільки sudo -iтакож змінюється ваш робочий каталог на домашній каталог вашого користувача, ви все одно можете використовувати його sudo -sв тих ситуаціях, коли ви знаєте, що хочете залишитися в тому самому каталозі, в якому ви були cd, коли ви бігали sudo. Однак все-таки безпечніше sudo -iта cdназад, де ти був.


2
Що ви маєте на увазі під "оболонкою від vi"?
crisron

11
@crisron: зсередини viвведіть :shі натисніть Enter. Тепер ви знаходитесь в підколонці з усіма привілеями viпроцесу, який породив цю оболонку. Якщо viвикористовується з привілеями root, так і оболонка. Або ви можете запустити щось інше, ніж оболонку через :!cmd, прочитати вихід з команди в буфер редагування через :r !cmdтощо. Якщо всі вони заблоковані, Makefileцілі - це сценарії оболонки, а Vim - :makeкоманда, яка ефективно дозволяє запускати довільну оболонку сценарії з редактора. Можливості для пустощів є надто величезними, щоб ця рамка для коментарів була доступною.
Warren Young

2
якщо хтось може поставити підробку в баш у вашій ПАРТІ, то хтось може покласти фальшиве судо у вашу ПАТ. щоб бути справді впевненим, що ви повинні викликати судо, використовуючи повний шлях:/usr/bin/sudo
lesmana

1
@lesmana: Я вирішив це в редакції; По суті, PATHце не єдина проблема.
Воррен Янг

6
Чудове пояснення; великий головний біль, читаючи це.
лобі

27

З посту 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може перезаписати корінь. Це спричиняє звичайні проблеми з користувачами пізніше, такі як неможливість запускати певні графічні програми через 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це правильна команда, яку потрібно запустити, коли потрібно, щоб коренева оболонка не була використана середовищем користувача.


1
Наскільки середовище "пошкоджене", залежить також від конфігурації sudo/etc/sudoersі пов'язаних з ними файлів). Параметри конфігурації , такі як always_set_home, env_reset, env_keep, env_checkі env_reset, і вони можуть варіюватися в залежності від користувача і команди. Дивіться розділ "Навколишнє середовище команди" та " СУДОЕРСЬКІ ВАРІАНТИ " на сторінці " Судори " (5) .
Керт Дж. Сампсон

Особисто sudo -Hsмені подобається, коли я хочу, щоб середовище не було задоволене моїми налаштуваннями, оскільки я використовую zsh та всі облікові записи додатків, які я можу змінити, щоб використовувати bash. Це дає можливість певній кількості змінних середовища пройти непомітно, але я зазвичай знаходжу ті, які мають значення, перезаписатись /etc/profile.d/*.
Ед Грімм

7

su( s witch u ser або s ubstitute u ser) дозволяє перемикати користувача. suв основному запускає інший екземпляр оболонки з привілеями призначеного користувача. За замовчуванням він переключає вас на rootкористувача, якщо ми хочемо переключити конкретного користувача, нам потрібно передати користувача наступним чином:

$ su bob  # switches to bob (requires bob's password)

su -означає, що змінні середовища будуть скинуті до root та suозначають змінні середовища як старі користувачі.

наприклад: домашній каталог root, якщо ви використовуєте su -або старий домашній каталог користувача, якщо ви використовуєте su.

sudo ( s uper u ser do ) - утиліта командного рядка, яка дозволяє користувачам запускати програми з привілеями безпеки іншого користувача, за замовчуванням є суперрусером, тобто root. Він використовує файл конфігурації, в /etc/sudoersякому перераховується, які користувачі мають права на певні дії

Судо слід читати як / ˈsuːduː / . синтаксис, sudo commandтобто s witch u ser і виконайте цю команду.

  • suеквівалентний sudo -iта імітує вхід у кореневий рахунок. Ваша робоча директорія буде /root, і вона буде читати кореневі і .profileт.д. Підказка зміниться з $ на #, що означає, що у вас є кореневий доступ.

  • sudo -s запускає оболонку як корінь, але не змінює ваш робочий каталог.

  • sudo bash де bashкоманда для запуску sudo. Ця команда працює bashяк супер користувач.

  • За допомогою sudoможна реєструвати все, що хтось робить.
  • Використання sudoне дозволяє користувачеві знати кореневий пароль.
  • Використовуючи sudoми можемо обмежити команди, дозволені для запуску.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.