为了启动 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
检查可能会有用。