Чому нам потрібно запускати root у терміналі для відключення та перезавантаження?


65

Коли ми встановлюємо / видаляємо / оновлюємо пакети або вносимо будь-які зміни, які потребують адміністративних привілеїв, нам буде запропоновано пароль користувача адміністратора, який має sudoпривілеї - це відбувається як через GUI, так і через термінал.

підказка через gui

Однак якщо ми спробуємо відключити та перезапустити через термінал, він скаржиться, що нам потрібно root:

$ reboot
reboot: Need to be root

$ shutdown now
shutdown: Need to be root

Але нас ніколи не просять пароль, коли ми виконуємо ці дії через зубчасте колесо вгорі праворуч.

меню зубчастих коліс

Чому існує така невідповідність?


5
Добре запитання .. Ви знаєте, що я збирався задати те саме. Мій сценарій полягав у відключенні Ubuntu за допомогою скорочених клавіш. i, e коли я коли-небудь натискаю якусь призначену клавішу, наприклад ctrl + super + s, вона виконує команду, sudo shutdown -h nowале проблема полягала в тому, що без дозволу доступу shutdownвона ніколи не працює .. Тому що де / як буде просити пароль ввести після натискання клавіші швидкого доступу .. Сподіваюся, ви зрозуміли мою ситуацію .. :)
Саурав Кумар


Відповіді:


50

Відключення зубчастих коліс перевіряє, чи дозволено вимкнути машину. Це робиться через PolicyKit. У разі вимкнення цього твердження у файлі /usr/share/polkit-1/actions/org.freedesktop.consolekit.policyперевіряється:

<action id="org.freedesktop.consolekit.system.stop">
  <description>Stop the system</description>
  <message>System policy prevents stopping the system</message>
  <defaults>
    <allow_inactive>no</allow_inactive>
    <allow_active>yes</allow_active>
  </defaults>
</action>

PolicyKit запускає dbus-sendкоманду. У разі відключення це буде:

dbus-send --system --print-reply --dest=org.freedesktop.Hal /org/freedesktop/Hal/devices/computer org.freedesktop.Hal.Device.SystemPowerManagement.Shutdown

У фоновому режимі працює демон з root-Privileges, який викликає для вас команду відключення.

Коли ви хочете мати змогу вимкнути машину «по-старому» за допомогою командного рядка ( shutdown, reboot, halt, ...), тоді вам потрібно додати до цих команд suid-Bit. Але пам’ятайте, що всі у вашій системі, які мають доступ до оболонки, можуть вимкнути вашу машину.


14
Трохи безпечнішим варіантом буде дозволити відключення бездоганного пароля sudoers тощо. Це легко здійснити: введіть sudo visudo, додайте %sudo ALL = NOPASSWD: /sbin/shutdown, /sbin/poweroff, /sbin/halt, /sbin/reboot, збережіть та вийдіть. Таким чином, перезавантаження командного рядка все ще потребуватиме sudo reboot, але вам не доведеться вводити свій пароль.
Себастьян Тюрршмідт

27

Ubuntu - це розподіл GNU / Linux Operationg System, який, в свою чергу, належить до сімейства систем Unix - загальної архітектури для ряду сучасних операційних систем.

Традиційно Unix використовувався для роботи на комп'ютерах з основним середовищем. Центральні обчислювальні засоби, які обслуговують десятки або сотні користувачів через віддалені термінали. Оскільки всі користувачі покладалися на доступність основного кадру, жодному користувачеві не було дозволено видавати команду відключення. Ідея, яка є основоположною для архітектури Unix - ядро ​​системи ніколи не ініціалізує відключення, якщо відповідна функція не буде викликана суперусерським процесом.

У сучасних настільних системах розробники пережили певні болі, щоб зробити закриття доступним для простого користувача робочого столу. Поширена техніка полягає в тому, щоб дозволити менеджеру входу, який зазвичай працює в контексті безпеки кореневого користувача, обробляти вимикання та перезавантаження. У цьому випадку графічна оболонка надсилає запит менеджеру реєстрації, щоб вимкнути комп'ютер. Це передбачає використання міжпроцесорного зв'язку (IPC), як правило, через сервіс dbus.

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

У деяких середовищах на робочому столі не використовуються послуги на базі IPC, а скоріше набір допоміжних програм для надання однакових або подібних функцій. Ці програми-помічники будуть викликатися через механізми, що дозволяють перейти в суперпользовательский контекст, наприклад, sudo, suid або механізм політика, схожий на sudo.

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


14

Оскільки Linux зазвичай використовується як сервер чи подібне, а SSHing у вікно Linux, навіть звичайний ноутбук Ubuntu, є досить поширеним явищем.

Справа в тому, що ви, можливо, не хочете, щоб люди, які мають доступ до SSH, змогли його закрити, особливо коли можуть бути інші віддалені користувачі, які користуються ним. Хтось із доступом до графічного інтерфейсу - добре, він все одно може вимкнути його за допомогою кнопки фізичного живлення.

Крім того, користувач, який віддалено ввійшов у систему, не зможе його ввімкнути.


Мені тоді не прийшло в голову, коли я задавав це питання, але я вважаю, що це варіанти в Ubuntu встановити пакети GUI на віддаленому сервері та використовувати віддалений сервер через GUI замість командного рядка. (Подібно до того, як працює Windows Remote Desktop або Teamviewer). Таким чином, це скасує припущення про те, що хтось, що використовує Ubuntu через GUI, може відключитись за допомогою кнопки фізичного живлення.
Адітя

@aditya, якому потрібен сервер, налаштований таким чином, що адміністратор повинен вирішити
Manishearth

Так. Потрібні кореневі привілеї, щоб мати можливість встановлювати пакети та конфігурувати за потребою. Але цей сценарій мені прийшов до тями, читаючи вашу відповідь вчора, і я думав, що поділюся з вами :-)
Адітя

14

Коли я перезавантажуюсь через GUI, я можу це зробити без sudoпароля.

Тільки якщо ви єдиний, хто ввійшов у систему. Якщо є інші користувачі (включаючи користувачів консолі), можливо, вам доведеться ввести кореневий пароль. Це те саме в OS X та новіших версіях Windows.

Чому так? Що відбувається всередині системи ubuntu там?

Наступна команда:

/usr/bin/dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop

D-Bus - це механізм IPC - середовище для локальної комунікації між процесами, що працюють на одному хості.

D-Bus "розумніший", ніж протоколи, що передають повідомлення низького рівня, такі як UDP. З іншого боку, він несе повідомлення як дискретні предмети, а не безперервні потоки даних.

D-Bus має структурований вигляд даних, які він несе, і обробляє дані у двійковій формі; інтегральні числа різної ширини, рядків тощо. Оскільки дані є не просто "необробленими байтами" для D-Bus, повідомлення можуть бути перевірені.

- Безкоштовний робочий стіл

Чому shutdownкоманда просто не перевіряє, чи хтось увійшов? Здається, чесною є комерційна особливість. Я можу уявити, що іноді це заощадить час, але часто віддають перевагу послідовної консолі. Я не хочу, щоб команди іноді вимагали пароль після його запуску, а іноді ні.

Мої займенники - Він / Він


Також є додаткова версія через додаток qdbus
Сергій Колодяжний

Під час вимкнення / виходу з DE (GNOME в цьому випадку) мене не запитують sudoпароль root / користувач, ні з іншим користувачем, який увійшов через GDM, ні з іншим користувачем, який увійшов через tty.
кос

@kos hu, це дивно. Цей знімок екрана Gnome 3, і я ввійшов у систему gui and tty
Тім

Я маю на увазі, що я отримую те саме повідомлення, але натискання кнопки "Вимкнути живлення" просто продовжує роботу та вимикає систему. Я також попросив Фаббі перевірити це, і він робить те ж саме і для нього, не знаючи, про що це.
kos

@kos ohh. Ху повісь.
Тім

9

Причина, що вам не потрібно мати root, щоб ініціювати відключення графічного інтерфейсу, є значною мірою зручністю для типового користувача робочого столу. Система знає, що ви користувач увійшов на консоль, тому якщо помилково вимкнути комп’ютер, ви можете, ймовірно, увімкнути його.

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

Причина того, що вимкнення не забезпечує підказку GUI для пароля суперкористувача, ймовірно, просто в тому, що там не можна отримати реальної утиліти - якщо ви знаходитесь на консолі, де відображатиметься підказка, ви можете просто скористатися програмою cog- натомість меню коліс. Якщо ви хотіли мати командний рядок пароля суперкористувача для відключення, це вже доступно при "sudo shutdown".


5

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

Діто також команди Halt і PowerOff.


2
Дякую за вашу відповідь, я розумію, що я як користувач машини, якою користуються десятки, не повинен мати змогу перезавантажувати машину, але що робить Ubuntu (або майже всі дистрибутиви на робочому столі), коли я вирішив перезавантажитись за допомогою миші замість клавіатури? Вони дозволяють це без привілеїв.
asco

3
Такі компоненти, як systemctl, loginctl, systemd, системні політики тощо, дозволяють поточному користувачеві, що ввійшов у систему, отримати доступ до певних кореневих функцій, не вимагаючи явного доступу до root, щоб зробити робочий стіл більш зручним для користувачів, але вони не обов'язково викликають командний рядок команди для виконання цих завдань.
Джефф Серено
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.