Які відмінності між "su", "sudo -s", "sudo -i", "sudo su"?


148

Я вже читав його з посібника, але я не бачу різниці ..

su - змінити ідентифікатор користувача або стати надрукованою

sudo -s [command]

Параметр -s(shell) запускає оболонку, задану змінною середовища SHELL, якщо вона встановлена ​​або оболонка, як зазначено в passwd (5). Якщо вказана команда, вона передається оболонці для виконання. В іншому випадку виконується інтерактивна оболонка.

sudo -i зникнути опис у посібнику


7
Крім того, не використовуйте su userдля входу з ненадійних оболонок, але su - user. Дивіться unix.stackexchange.com/q/7013/8250
Лекенштейн

@ Leekensteyn вау, чудовий приклад. thx для LOL :)
törzsmókus

1
завжди пам’ятай стару заповідь: ти не вимагатимеш імені кореня даремно!
törzsmókus

Не кажучи, що sudo -iце погано, але ви, звичайно, зможете використати це
Калоб Колоб

Відповіді:


118

Основна відмінність цих команд полягає в тому, як вони обмежують доступ до своїх функцій.

su (що означає "заміна користувача" або "користувач комутації") - робить саме це, він запускає інший екземпляр оболонки з привілеями цільового користувача. Щоб переконатися, що у вас є права на це, він запитає пароль цільового користувача . Отже, щоб стати root, вам потрібно знати пароль root. Якщо на вашій машині є кілька користувачів, яким потрібно запускати команди як root, всі вони повинні знати пароль root - зауважте, що це буде той самий пароль. Якщо вам потрібно відкликати права адміністратора у одного з користувачів, вам потрібно змінити кореневий пароль і повідомити його лише тим людям, яким потрібно зберегти доступ - безладно.

sudo (хм ... що таке мнемонічне? Super-User-DO?) зовсім інше. Він використовує конфігураційний файл (/ etc / sudoers), в якому перераховується, які користувачі мають права на певні дії (запускати команди як root тощо). Після виклику він запитує пароль користувача, який його запустив - щоб переконатися, що людина в термінал - це той самий "джоу", який вказаний у списку /etc/sudoers. Щоб скасувати права адміністратора у людини, вам просто потрібно відредагувати файл конфігурації (або видалити користувача з групи, яка вказана в цьому конфігурації). Це призводить до набагато більш чіткого управління привілеями.

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

Також /etc/sudoersдозволяє вказати деякі додаткові параметри - наприклад, користувач X може запускати програму лише Y

sudo suКомбінація, що часто використовується, працює наступним чином: спочатку sudoзапитає ваш пароль, і, якщо вам це дозволено, викликає наступну команду ( su) як суперкористувача. Оскільки suвін викликається root, він не вимагає введення пароля цільового користувача. Отже, sudo suдозволяє відкрити оболонку як інший користувач (включаючи root), якщо вам дозволяється суперкористувач за допомогою /etc/sudoersфайлу.


2
Я ніколи не бачив suяк "користувач, що перемикається", але завжди як суперпользователь; поведінка за замовчуванням без чужого імені користувача (хоча це має сенс). З вікіпедії : "Команду su, яку ще називали суперкористувачем [1] ще в 1974 році, також називали" користувачем-замінником "," користувачем підробкою "або" встановити користувача ", оскільки вона дозволяє змінювати обліковий запис, пов'язаний з поточним термінал (вікно). "
д-р Джимбоб

5
@dr jimbob: ти маєш рацію, але я вважаю, що "користувач з комутацією" начебто краще описує те, що він робить - хоча історично це означає "суперкористувач". Я також радий виявити, що стаття з вікіпедії дуже схожа на мою відповідь - я ніколи раніше не бачив статті :)
Сергій

11
Офіційне значення "su" - "користувач-замінник". Див .: "людина су".
Angel O'Sphere

1
@ AngelO'Sphere: Цікаво, що на сторінці Ubuntu взагалі не згадується про "заміну". На сторінці в gnu.org ( gnu.org/software/coreutils/manual/html_node/su-invocation.html ) дійсно сказано "su: Запустити команду із ідентифікатором користувача-замінника та групи". Я думаю, що gnu.org є канонічним джерелом :)
Сергій

1
Про що sudo su?
Каз Вулф

59

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

sudo -sзапускає оболонку з правами root. sudo -iтакож набуває середовище кореневого користувача.

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

Більше обговорення цього точного питання тут .


20
"ти сам з привілеями root" - це не те, що відбувається насправді :) Насправді бути "самим з привілеями кореня" неможливо - або ти root, або ти сам. Спробуйте ввести whoami в обох випадках. Той факт, що cd ~результати різні, є результатом того, що sudo -s не встановлює змінну середовища $ HOME.
Сергій

1
@Sergey, хто говорить, що це "root", тому що ви запускаєте cmd 'whoami', як ніби ви судовали його, тому тимчасово (на час дії цієї команди) ви виявляєтесь користувачем root, але ви, можливо, все ще не маєте повноцінного користування кореневий доступ відповідно до файлу sudoers.
Восьминіг

1
@Octopus: те, що я намагався сказати, - це те, що в Unix процес може мати лише один UID, і UID визначає дозволи процесу. Ви не можете бути "самим з привілеями root", програма або працює з вашим UID, або з UID root (0).
Сергій

5
Щодо "у вас все ще не може бути повного кореневого доступу відповідно до файлу sudoers": sudoersфайл управляє тим, хто може виконувати яку команду як інший користувач, але це відбувається до того, як команда буде виконана. Однак, як тільки вам дозволили запустити процес як, скажімо, root - запущений процес має UID root і має повний доступ до системи, sudo не може обмежити це. Знову ж таки, ти завжди або сам, або корінь, немає "пів-половини". Отже, якщо sudoersфайл дозволяє запускати оболонку як root - дозволи в цій оболонці не відрізнятимуться від "нормальної" кореневої оболонки.
Сергій

36

Ця відповідь є справжньою моєю відповіддю на зміст цього питання , викладіть тут канонічну відповідь, щоб люди могли її знайти!

Основна різниця між sudo -iі sudo -s:

  • sudo -iдає вам кореневе середовище, тобто ваше ~/.bashrcігнорується.
  • sudo -sнадає вам середовище користувача, тому його ~/.bashrcповажають.

Ось приклад, ви бачите, що lslу мене в моєму ~/.bin/каталозі є додаток, який доступний через, sudo -sале не доступний sudo -i. Зауважте також, що запит Bash змінюється як буде, sudo -iале не sudo -s:

dotancohen@melancholy:~$ ls .bin
lsl

dotancohen@melancholy:~$ which lsl
/home/dotancohen/.bin/lsl

dotancohen@melancholy:~$ sudo -i

root@melancholy:~# which lsl

root@melancholy:~# exit
logout

dotancohen@melancholy:~$ sudo -s
Sourced .bashrc

dotancohen@melancholy:~$ which lsl
/home/dotancohen/.bin/lsl

dotancohen@melancholy:~$ exit
exit

Хоча sudo -sце зручно давати вам оточуюче середовище, з яким ви знайомі, я рекомендую використовувати їхsudo -i з двох причин:

  1. Візуальне нагадування про те, що ви перебуваєте в сеансі "root".
  2. Кореневе середовище набагато рідше може отруїтися зловмисними програмами, такими як шахрайська лінія в .bashrc.

Я помітив, що sudo -s, здається, не обробляє / etc / profile, або що-небудь у мене є в /etc/profile.d/ .. будь-яка ідея чому?
meffect

@dotancohen - Що ви маєте на увазі під sudo -sумовами, які користувач знайомий?
Мотивовано

@dotancohen - Команда sudo -s вже надає візуальні підказки, тому я цікавлюсь, чому sudo -i є кращим варіантом.
Мотивовано

9

su запитує пароль користувача "root".

sudoзапитує власний пароль (а також перевіряє, чи дозволено вам виконувати команди як корінь, який налаштовано через /etc/sudoers- за замовчуванням всі акаунти користувачів, які належать до груп "admin" або "sudo", можуть використовувати sudo).

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


1
щоб зробити відповідь більш повною: sudo -sмайже дорівнює su($ HOME відрізняється) і sudo -iдорівнюєsu -
DJCrashdummy

@DJCrashdummy - Чому ви говорите майже рівним? Чим відрізняється?
Мотивовано

2

В Ubuntu або спорідненій системі я не знаходжу багато користі suв традиційному, суперкористувацькому сенсі. sudoРучки з цим корпусом набагато краще. Однак, suчудово підходить для того, щоб стати іншим користувачем в разових ситуаціях, коли налаштування sudoers було б нерозумно.

Наприклад, якщо я ремонтую свою систему з живого CD / USB, я часто монтую свій жорсткий диск та інші необхідні речі chrootв систему. У такому випадку моя перша команда:

su - myuser  # Note the '-'. It means to act as if that user had just logged in.

Таким чином, я працюю не як root, а як мій звичайний користувач, а потім використовую, sudoяк годиться.


0
  • su Задає пароль root, стає root, відкриває інтерактивну оболонку без входу.
  • su - Задає пароль root, стає root, відкриває інтерактивну оболонку входу.

  • sudo -s Запитує ваші паролі, стає root, відкриває інтерактивну оболонку без входу.
  • sudo -i Запитує ваші паролі, стає root, відкриває інтерактивну оболонку входу.

Найкращою практикою є використання цих двох.


  • sudo suЗапитує ваш пароль, стає root на секунду і працює suяк root`.
  • sudo su -Запитує ваш пароль, стає root на секунду і працює su -як root.

Так що в цьому випадку ви працюєте з suвикористанням , sudoі ви не повинні знати фактичний пароль суперкористувача. Результати такі ж, як suі su -.


Яка різниця між входом та оболонкою без входу?
Пілот6

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