gnome 如何在没有 root 权限的情况下重新启动?

osd*_*amv 8 linux polkit systemd reboot

我正在阅读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
Run Code Online (Sandbox Code Playgroud)

编辑:我的用户组

[damian@xvz:~]$ groups 
damian sudo wireshark bumblebee
Run Code Online (Sandbox Code Playgroud)

编辑 2:systemctl 权限

[damian@xvz:~]$ ls -l /bin/systemctl 
-rwxr-xr-x 1 root root 626640 Jun 28 04:23 /bin/systemctl
Run Code Online (Sandbox Code Playgroud)

don*_*sti 12

这是通过一个名为的授权管理器完成的polkit

polkit 提供了一个授权 API,旨在供特权程序(“MECHANISMS”)使用,通常通过某种形式的进程间通信机制为非特权程序(“SUBJECTS”)提供服务。

随着systemdpolkit用户使用非远程会话可以发出功率相关的命令。您可以列出所有polkit已注册的操作并获取有关其中任何操作的详细信息pkaction(不带参数调用它将列出所有操作 ID)。
在这种特殊情况下,org.freedesktop.login1.reboot如果您运行:

pkaction --action-id org.freedesktop.login1.reboot --verbose
Run Code Online (Sandbox Code Playgroud)

输出应该是这样的:

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
Run Code Online (Sandbox Code Playgroud)

此处,active: yes表示活动会话中的用户有权重新启动系统(有关隐式授权的详细信息在polkit页面上)。您可以通过以下方式检查您的会话是否处于活动状态:

loginctl show-session $XDG_SESSION_ID --property=Active
Active=yes
Run Code Online (Sandbox Code Playgroud)

  • @osdamv 请注意,您可以使用 `sudo --user=jimmy` 运行所有您不信任的程序,其中用户 `jimmy` * 无权执行该 polkit 命令... (3认同)