'sudo su -' vs 'sudo -i' vs 'sudo / bin / bash' - коли важливо, що використовується, чи це взагалі має значення?


254

Коли я роблю щось, для чого потрібно вводити root десятки разів поспіль, я вважаю за краще переключити сеанс на кореневий сеанс. У різних навчальних посібників та інструкцій я використовував в Інтернеті, я бачу sudo su, sudo su -, sudo -iі sudo /bin/bashвикористовується , щоб відкрити кореневої сеанс, але я не ясно , про різницю між ними і коли або якщо ця різниця має велике значення.

Чи може хтось мені це очистити?


11
Ви забули запитати про sudo -sі sudo su.
Radu Rădeanu




3
@ RaduRădeanu Коли я набрав це питання, я переглянув запропоновані питання, і жодне з них не вирішило мого повного питання. Те саме стосується питань, з якими ви пов’язані. Хоча вони містять багато нової інформації для мене, і дякую вам за посилання на них, я виявив їх не такими повними, як поданий нижче хаос відповідей, що набагато більше відповідає тому, що я шукав.
Павло

Відповіді:


325

Для пояснення цього потрібно знати, що роблять програми:

  • su- Команда suвикористовується для переключення на іншого користувача ( s witch u ser), але ви також можете переключитися на головного користувача, викликаючи команду без параметра. suпросить вас переключити пароль користувача після введення пароля, який ви перейшли в середовище користувача.
  • sudo- sudoпризначений для запуску однієї команди з правами root. Але на відміну від suцього, вам підкаже пароль поточного користувача. Цей користувач повинен бути у файлі sudoers (або у групі, що знаходиться у файлі sudoers). За замовчуванням Ubuntu "запам'ятовує" ваш пароль протягом 15 хвилин, так що вам не доведеться вводити свій пароль щоразу.
  • bash- Текстовий інтерфейс для взаємодії з комп'ютером. Важливо зрозуміти різницю між вхідними, невхідними, інтерактивними та неінтерактивними оболонками:

Види оболонок:

  • оболонка для входу : оболонка для входу вводить вас у систему як вказаний користувач, необхідні для цього - ім’я користувача та пароль. Якщо натиснути ctrl+ alt+ F1для входу у віртуальний термінал, ви отримаєте після успішного входу оболонку входу.
  • оболонка без входу : оболонка, яка виконується без входу в систему, необхідна для цього, є користувачем, який зараз увійшов. Коли ви відкриваєте графічний термінал у gnome, це оболонка без входу.
  • інтерактивна оболонка : оболонка (вхід або не вхід), де ви можете інтерактивно вводити або переривати команди. Наприклад, термінал gnome.
  • неінтерактивна оболонка : (під) оболонка, яка, ймовірно, виконується з автоматизованого процесу. Ви не побачите ні вводу, ні виводу.

Отже, такі випадки:

  • sudo suДзвінки sudoза допомогою команди su. Bash називається інтерактивною оболонкою без входу. Тож баш тільки виконує .bashrc. Ви можете бачити, що після переходу на root ви все ще знаходитесь в одному каталозі:

    user@host:~$ sudo su
    root@host:/home/user#
  • sudo su -На цей раз це Ввійти оболонки, так /etc/profile, .profileі .bashrcвиконується , і ви опинитеся в домашній директорії суперкористувача з навколишнім середовищем суперкористувача.

  • sudo -iЦе майже те саме, що параметр sudo su --i (імітувати початковий вхід) запускає оболонку, задану вводом бази даних пароля цільового користувача у вигляді оболонки для входу. Це означає , що Логін конкретних ресурсів , таких як файли .profile, .bashrcабо .loginбуде читати і виконана оболонкою.

  • sudo /bin/bashЦе означає, що ви телефонуєте sudoза допомогою команди /bin/bash. /bin/bashзапускається як оболонка без входу, тому всі крапки-файли не виконуються, а сам bash читає .bashrcвиклику користувача. Ваше оточення залишається таким же. Ваш дім не буде домом кореня. Отже, ви root, але в оточенні виклику користувача.

  • sudo -sчитає $SHELLзмінну та виконує вміст. Якщо він $SHELLмістить, /bin/bashвін викликає sudo /bin/bash(див. Вище).

Перевірка:

Щоб перевірити, чи перебуваєте ви в оболонці входу чи ні (працює лише в bash, оскільки shoptце вбудована команда):

shopt -q login_shell && echo 'Login shell' || echo 'No login shell'

18
Просто уточнення: sudoдозволяє дозволеному користувачеві виконувати команду як суперпользователь або інший користувач . У будь-якому разі +1 за ваші зусилля.
Radu Rădeanu

2
@chaos Дякую за відмінну відповідь! Це в основному відповідає на мої запитання, тому я пішов вперед і позначив відповідь на запитання, але я не розумію, коли бажано запустити певну оболонку. Я дійсно використовую Ubuntu лише через командний рядок, і я вважаю, що найчастіше я відкриваю rootсеанс користувача (порівняно з використанням sudo) - це коли я роблю щось, що вимагає великого використання rootпривілеїв, наприклад, коли встановлюється щось нове або виконується основна конфігурація. . Я використовував sudo /bin/bash, але, мабуть, цей метод поганий реп чомусь не розумію.
Павло

2
Крім того, правильніше сказати, що su означає для користувача комутатора, а не для суперкористувача. Тобто запустіть скрипт php: su www-data /usr/share/script.php або просто www-дані для інтерактивної оболонки. Але без жодного імені користувача буде входити кореневий (суперкористувацький) рахунок.
обличчя

Хаос - "shopt -q login_shell && echo 'Оболонка для входу" || ехо "Немає оболонки для входу" "Ці пропозиції я бачу часто, але навіщо робити це так довго? Оператор && означає, що якщо код виходу 0, то "виконайте наступну команду", а подвійні труби (||) означають інше (якщо не 0), тоді виконайте цю команду. Отже, що в основному говорять, якщо код виходу 0, то відлунюйте "Оболонку входу", якщо код виходу 1 (невдача), то відлунюйте "Без входу". Чому б не просто "shopt -q login_shell; echo $?" $? означає код результату / виходу попередньої команди. У більшості випадків, якщо не всі програми 0 означають успіх, 1 або більше засобів провалюються. Тож якщо відлуння дорівнює 0 = успіх ...
oblivian

2
@Paul: sudo -iпропонується. Читайте тут: ubuntuforums.org/showthread.php?t=1817402 і тут: unix.stackexchange.com/questions/98531/…
Marco Sulla

0

Щоб шукати відмінності, ви можете перевірити отримане середовище серед різних викликів.

Ви можете знайти деякі "невеликі" відмінності в деяких критичних змінних:

  • PATH, LD_LIBRARY_PATH,LD_PRELOAD

або деяка різниця в ~ /. обробка точкових файлів ( ~/.config).

Розглянемо також право власності на логісти на основі $ HOME ( ~/.xsession.errorsтощо) ... або файли cookie xauth ( ~/.Xauthority), які генерують команди.

Спробуйте скористатися цими командами:


# 'su -' vs 'su'

diff <(sudo su - -c env | sort) <(sudo su -c env | sort)


# 'su -' vs 'sudo -i'

diff <(sudo su - -c env | sort) <(sudo -i env | sort)

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