Linux 桌面可以执行用户从终端登录时无法执行的多项操作。只有 sudo 用户在输入密码后才能进行系统关闭和更改系统时间等操作。这是如何运作的。是否有一个根守护进程正在运行,它从登录用户那里获取命令。请指导我找到正确的答案。
我正在运行 Ubuntu 13.10。
目前在Ubuntu,实际关机,则是由console-kit-daemon
,在ConsoleKit的守护进程,它以root权限运行。ConsoleKit 守护进程通过D-Bus接收来自桌面面板应用程序的关闭请求。允许非特权进程与特权进程对话的策略由polkit(以前称为 PolicyKit)处理。dbus-send
如果您愿意,您可以模拟 ConsoleKit 调用。特别是,要告诉 ConsoleKit 执行关闭,您可以执行以下操作:
dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" \
/org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop
Run Code Online (Sandbox Code Playgroud)
在 Ubuntu 上,ConsoleKit 取代了硬件抽象层(HAL),这是一个子系统,旨在允许桌面应用程序通过可移植和抽象的 API 发现和使用主机系统的硬件,而不管底层硬件的类型。HAL 目前在大多数 Linux 发行版中已弃用。dbus-send
使用 HAL的等效调用是:
dbus-send --print-reply --system --dest=org.freedesktop.Hal \
/org/freedesktop/Hal/devices/computer/org.freedesktop.Hal.Device.SystemPowerManagement.Shutdown
Run Code Online (Sandbox Code Playgroud)
目前,ConsoleKit 没有被积极维护。freedesktop.org项目的重点已经转向systemd init 系统的内置席位/用户/会话管理,称为systemd-logind。这将如何影响采用自己的 init 系统的发行版,如Ubuntu 中的暴发户,还有待观察。