Как DE вызывает функцию ACPI?

6

Хорошо, во-первых, это не проблема, с которой я сталкиваюсь, но я хотел бы понять это лучше.

Если я хочу выключить / перезагрузить компьютер из командной строки, мне нужно позвонить:

$ sudo poweroff
$ sudo reboot

То есть мне нужны права суперпользователя для выполнения этих вызовов ACPI.

Однако я запускаю свой DE (я использую XFCE) без предоставления ему привилегий root: $ startxfce4 --with-ck-launch

Теперь я знаю, что --with-ck-launchпараметр помогает XFCE выключать / перезагружать мою систему, но я не понимаю, как это сделать.

Что позволяет ConsoleKit завершать работу без прав root? Как он может изменить уровень выполнения без привилегий суперпользователя? И поскольку это возможно, как я могу выключить компьютер с консоли без прав root?

darnir
источник

Ответы:

2

Вы можете общаться с ConsoleKit через dbus. Например, с помощью dbus-sendинструмента несколько заметных команд:

Неисправность:

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

Перезагрузка:

dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Restart

Есть также команды для спящего режима и приостановки, но я не знаю, что они.


редактировать: Найдено приостановить команду

dbus-send --system --print-reply --dest=org.freedesktop.Hal /org/freedesktop/Hal/devices/computer org.freedesktop.Hal.Device.SystemPowerManagement.Suspend int32:0

По новым системам

dbus-send --system --print-reply --dest="org.freedesktop.UPower" /org/freedesktop/UPower org.freedesktop.UPower.Suspend
Алекс Л.
источник
Спасибо за эти команды! Сейчас я расскажу подробнее о dbus и dbus-send. Однако у меня все еще остается вопрос, могу ли я сделать этот вызов без привилегий root, разве это не угроза безопасности? Любой, обладающий указанными знаниями, может отключить мою машину без доступа root. Я имею в виду, что весь смысл необходимых привилегий суперпользователя для вызова poweroff и перезагрузки теряется, если я могу сделать вызов как таковой.
Дарнир
@darnir Я не очень знаком с фреймворком consolekit / policykit, но я почти уверен, что существует система разрешений, которая связана с активными сессиями / местами. По сути, любой может использовать dbus-send, чтобы попытаться отправить сообщения, но будут приниматься только сообщения из пользовательского сеанса, который в данный момент зарегистрирован и активен. Другие пользователи / сеансы получат ответ «отказано в авторизации», если они попытаются сделать что-либо из перечисленного.
jw013
2
@darnir Существует структура разрешений, созданная с помощью набора политик. Если вы хотите узнать больше об этом, прочитайте справочную pklocalauthorityстраницу и посмотрите на файлы /etc/polkit-1и их подкаталоги.
Алекс Л.
@ Алекс спасибо за ваш вклад. Я посмотрю в рамки policykit и pklocalauthority.
Дарнир