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


65

Когда мы устанавливаем / удаляем / обновляем пакеты или вносим какие-либо изменения, которые требуют административных привилегий, у нас запрашивается пароль администратора, который имеет эти sudoпривилегии - это происходит как через графический интерфейс, так и через терминал.

подскажите через графический интерфейс

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

$ reboot
reboot: Need to be root

$ shutdown now
shutdown: Need to be root

Но нас никогда не просят ввести пароль, когда мы выполняем эти действия с помощью зубчатого колеса в правом верхнем углу.

меню зубчатого колеса

Почему это несоответствие?


5
Хороший вопрос .. Вы знаете, что я собирался спросить то же самое. Мой сценарий состоял в том, чтобы выключить Ubuntu с помощью сочетаний клавиш. То есть, когда я нажимаю назначенную клавишу, например 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, который вызывает команду выключения для вас.

Если вы хотите иметь возможность завершить работу машины «по-старому» через командную строку ( shutdown, reboot, halt, ...), вам необходимо добавить бит suid к этим командам. Но имейте в виду, что каждый в вашей системе, имеющий доступ к оболочке, может отключить вашу машину.


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

27

Ubuntu - это дистрибутив операционной системы GNU / Linux, которая, в свою очередь, принадлежит к семейству систем Unix - общей архитектуры для ряда современных операционных систем.

Традиционно Unix используется для работы на мэйнфреймах. Центральные вычислительные средства, которые обслуживают десятки или сотни пользователей через удаленные терминалы. Поскольку все пользователи полагались на доступность мэйнфрейма, ни одному из пользователей не разрешалось выдавать команду отключения. Идея, которая является фундаментальной для архитектуры Unix - ядро ​​системы никогда не инициализирует выключение, если соответствующая функция не вызывается процессом суперпользователя.

В современных настольных системах разработчики приложили определенные усилия, чтобы сделать отключение доступным для простого пользователя настольного компьютера. Обычный метод - позволить менеджеру входа в систему, который обычно работает в контексте безопасности пользователя root, обрабатывать завершение работы и перезагрузку. В этом случае графическая оболочка выдает диспетчеру входа запрос на выключение компьютера. Это предполагает использование межпроцессного взаимодействия (IPC), как правило, через службу dbus.

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

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

В любом случае, глупая традиционная программа выключения на оболочке не работает таким образом, она требует, чтобы вы видели, что она запускается в контексте суперпользователя.


14

Поскольку Linux обычно используется как сервер или аналогичный, а SSHing в Linux-коробку, даже обычный ноутбук с Ubuntu, довольно распространен.

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

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


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

@aditya, которому нужен сервер, настроенный таким образом, что администратор должен решить сделать
Manishearth

Да. Для установки пакетов и настройки по мере необходимости потребуются права суперпользователя. Но этот сценарий пришел мне в голову, когда я читал твой ответ вчера, и я подумал, что поделюсь им с тобой :-)
Aditya

14

Когда я перезагружаюсь через графический интерфейс, я могу сделать это без моего sudoпароля.

Только если вы единственный, кто вошел в систему. Если есть другие пользователи (включая пользователей консоли), вам может потребоваться ввести пароль root. Это то же самое на 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 / user ни с другим пользователем, вошедшим в систему через GDM, ни с другим пользователем, вошедшим через tty.
Кос

@kos hu, это странно. Это скриншот с Gnome 3, и я вошел в систему с графическим интерфейсом и tty
Тим

Я имею в виду, что получаю то же сообщение, но нажатие кнопки «Выключить» просто выключает систему. Я также попросил Фабби проверить это, и то же самое он сделал и для него, не зная, что это такое.
Кос

@kos ооо Ху, держись.
Тим

9

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

Для пользователя в оболочке вы можете войти в систему удаленно, поэтому система требует, чтобы вы вошли в систему как пользователь root, чтобы выдать команду завершения работы. Это препятствует тому, чтобы обычный пользователь, вошедший в систему на сервере, отключил его, когда его используют другие люди, и хотя не обязательно, чтобы кто-либо физически присутствовал, чтобы запустить компьютер обратно.

Причиной того, что завершение работы не предоставляет приглашение с графическим интерфейсом для пароля суперпользователя, вероятно, является просто то, что там нет никакой реальной утилиты, которую можно получить - если вы находитесь на консоли, где появится приглашение, вы можете просто использовать cog- вместо колесного меню. Если вы хотите, чтобы в командной строке запрашивался пароль суперпользователя для выключения, он уже доступен с «sudo shutdown».


5

В многопользовательской системе последнее, что вам нужно, - это чтобы ваши пользователи входили в систему и могли произвольно перезагрузить сервер в любое время, поэтому версия Reboot для командной строки - это команда только для суперпользователя, поэтому вам нужно быть пользователем root или иметь права sudo.

То же самое касается команд Halt и PowerOff.


2
Спасибо за ваш ответ, я понимаю, что я, как пользователь компьютера, используемого десятками, не должен быть в состоянии перезагрузить компьютер, но что делает Ubuntu (или почти все настольные дистрибутивы), когда я решил перезагрузиться с помощью мыши вместо клавиатуры? Они позволяют это без привилегий.
Asco

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