为什么要认证?

为什么要认证?

为了启动 gdm,我使用此命令 sudo systemctl start gdm.service
当我直接在 shell 上执行此命令时,将看到

[sudo] password for username:

这是完全可以理解的,因为我使用 sudo 命令来获取权限,但是当我省略该sudo命令时,我得到了这个

==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ====
Authentication is required to start 'gdm.service'.
Authenticating as: username
Password:

其实我建立了一个权限为rwsr-xr-x的脚本文件,文件所有者为root,脚本内容为:

sudo systemctl start gdm

当我执行此操作时,它应该以 root 身份运行,而不要求输入密码,但它会询问这个。

[sudo] password for username:

我只想能够在不输入密码的情况下启动 gdm

答案1

这是从哪里来的?是 gdm 服务要求输入密码还是 systemd 二进制文件?

它是 systemctl 二进制文件。(或者,更准确地说,“启动”请求从 systemctl 发送到 systemd 再到 PolicyKit 服务,然后身份验证提示循环回到 systemctl 生成的“polkit-tty-agent”二进制文件。)

如果您曾经在 GNOME 中收到全屏“管理员密码”提示(例如当您尝试更改网络配置或运行时pkexec),这与情况完全相同。

无论哪种方式,它都不是 gdm,因为 gdm 尚未启动。

我已授予 sudo 权限那么为什么还要再授予一次呢?

这不清楚。当 systemctl 由 root 运行时,确实不应该显示此提示,因为 systemd 代码实际上会跳过对 uid 0 的这些检查。(至少我认为是这样。我必须重新检查。)

总的来说,PolicyKit 是一个替代系统,其目的是允许使用 systemctl 之类的东西没有明确使用 sudo 并成为 root。root 收到来自 polkit 的身份验证提示的情况相当罕见。

建议:

  • 运行journalctl -u polkit -n 100并查找任何提及“gdm”或“manage-units”的消息。它们是否说“所有者为 unix-user:root”或“unix-user:You”?

  • 尝试运行sudo pkexec。这应该会立即给出一个 shell 而没有任何提示(而运行 justpkexec仍应提示管理员身份验证)。pkexec 工具类似于“su 但具有更多的 polkit”。

  • 重新安装“polkit”包,以确保 /usr/share/polkit-1 中的默认策略已重置(以防它们已损坏)。我不确定这是否会起作用,因为 systemd 本身应该完全跳过 root 的 polkit 检查(即 polkit 策略应该无关紧要),但值得一试。

  • 检查/run/systemd/private套接字是否存在。当 systemctl 以 root 身份运行时,它将使用此套接字来直接的连接到 systemd(而不是通过 D-Bus),它同样应该完全绕过所有 polkit 检查。sudo strace -e connect systemctl status foo检查可能会有用。

相关内容