Когда я пытаюсь выключить компьютер из командной строки или терминала, у меня должны быть права root:
amy@amy:~$ shutdown now
shutdown: Need to be root
а также
amy@amy:~$ halt
halt: Need to be root
но при выключении с помощью графического интерфейса пользователя, т.е. кнопки выключения или аппаратного выключения, у меня не запрашивается пароль для этого. Что это отключает для графического интерфейса, и почему ему не нужны пароль или привилегии root?
Я использую Ubuntu 11.04 Natty.
Ответы:
Аппаратная кнопка питания запускает событие ACPI, которое
acpid
(демон ACPI) замечает и реагирует на него; в этом случае, выключив систему, хотя вы можете сделать так, как хотите. Демон ACPI работает от имени пользователя root, поэтому у него есть разрешение на выключение системы. Среды рабочего стола (например,gdm
для Gnome) обычно также запускаются с правами суперпользователя, поэтому я подозреваю, что они работают одинаково - у вас нет разрешения на выключение системы, но вы можете сказать,gdm
что хотите выключить ее, и она может сделать это на вашего имениисточник
acpid
сделать что-то отличное от уже существующего, вам нужно быть пользователем root, поэтому у вас уже есть разрешение на небезопасные действия. Также можно использовать системы MAC, такие как SELinux, для защитыacpid
, ограничивая действия, которые им разрешено делать, даже если они работают от имени пользователя root.acpid
настраивается, он может запускать разные сценарии в зависимости от аппаратных событий, которые он видит (например, яacpid
заблокировал компьютер, когда нажимаю кнопку питания)В ответе Майкла правильно обсуждаются функции системы при использовании аппаратного переключателя питания, но большинство рабочих сред фактически используют
dbus
для этой цели, а не делают это сами. Например, GNOME используетdbus
'sorg.freedesktop.Hal.Device.SystemPowerManagement.Shutdown
при нажатии кнопки выключения. Когда он отправляется, онdbus
выполняет некоторые проверки, чтобы определить, авторизован ли пользователь, отправляющий сообщение, на выполнение выключения, и если это так, он выключает систему.Вы можете подражать этому с помощью
dbus-send
. Например, чтобы завершить работу вашей системыdbus
, используйте что-то вроде этого:источник