如果我错了,请纠正我。当我们尝试使用以下命令从终端关闭或重启时 sudo init 0,sudo init 6(或用于相同目的的任何其他命令)命令我们需要以 root 身份执行这些任务,但是当我们从 Ubuntu(我猜大多数桌面都做同样的事情)UI 执行相同操作时,它只是不为这两项任务询问任何 root 权限。
这里正在发生什么样的对话/机制?
答案1
诸如此类的事情由 Polkit(其官方名称,但仍经常使用它以前的名称 PolicyKit)控制。
此工具可帮助非 root 用户对系统执行某些操作,否则这些操作需要 root 权限,而关机是通常配置为授予普通用户的操作之一。它的工作原理是用户软件调用特定的 Polkit API 请求关机,Polkit 将检查该用户是否有权执行该操作,如果有,则协助执行。如果用户没有有权力采取该行动。
有关 Polkit 架构的更多信息,请参见此处:
http://manpages.ubuntu.com/manpages/precise/man8/polkit.8.html
答案2
关机命令使用dbus
。实际上,关机命令是:
dbus-send --system --print-reply --dest=org.freedesktop.login1 /org/freedesktop/login1 "org.freedesktop.login1.Manager.PowerOff" boolean:true
确实systemd-logind
服务方对用户的损失不承担责任。
除了 @thomasrutter 所说的,systemd-logind
为用户提供基于PolicyKit的关机、休眠等操作的访问权限。
man systemd-logind
systemd-logind is a system service that manages user logins. It is
responsible for:
· Providing PolicyKit-based access for users to operations such as
system shutdown or sleep