我正在看书Linux内核开发,在第 5 章“系统调用实现”第 77 页中说
例如,capable(CAP_SYS_NICE) 检查调用者是否有能力修改其他进程的nice值。默认情况下,超级用户拥有所有能力,而非 root 不具备任何能力。例如,这里是reboot()系统调用。请注意其第一步是如何确保调用进程具有 CAP_SYS_REBOOT 。如果删除该条件语句,任何进程都可以重新启动系统。
然而,在我的 Debian Sid 中,我可以使用 gnome 或执行 /sbin/reboot 来重新启动我的机器,而无需 sudo 或 su。这怎么可能?
也许用systemctl?
ls -l /sbin/reboot
lrwxrwxrwx 1 root root 14 Jun 28 04:23 /sbin/reboot -> /bin/systemctl
编辑:我的用户组
[damian@xvz:~]$ groups
damian sudo wireshark bumblebee
编辑2:systemctl权限
[damian@xvz:~]$ ls -l /bin/systemctl
-rwxr-xr-x 1 root root 626640 Jun 28 04:23 /bin/systemctl
答案1
这是通过一个名为的授权管理器完成的polkit
:
polkit 提供了一个授权 API,旨在由特权程序(“机制”)使用,通常通过某种形式的进程间通信机制为非特权程序(“主题”)提供服务。
具有非远程会话的用户可以发出与电源相关的命令systemd
。polkit
您可以列出所有polkit
已注册的操作并获取其中任何操作的详细信息pkaction
(不带参数调用,它将列出所有操作 ID)。在这种特殊情况下,如果您运行以下
操作,则操作 ID 如下:org.freedesktop.login1.reboot
pkaction --action-id org.freedesktop.login1.reboot --verbose
输出应该类似于:
org.freedesktop.login1.reboot:
description: Reboot the system
message: Authentication is required for rebooting the system.
vendor: The systemd Project
vendor_url: http://www.freedesktop.org/wiki/Software/systemd
icon:
implicit any: auth_admin_keep
implicit inactive: auth_admin_keep
implicit active: yes
这里,active: yes
表示活动会话中的用户有权重新启动系统(有关隐式授权的详细信息请参阅polkit
页面)。您可以通过以下方式检查您的会话是否处于活动状态:
loginctl show-session $XDG_SESSION_ID --property=Active
Active=yes