本地执行shutdown命令无需sudo但SSH远程执行需交互认证的原因咨询
这事儿其实和**Polkit(原PolicyKit)**的权限控制脱不了干系,咱们一步步拆解清楚:
shutdown的本质是调用systemctl
你已经通过ls -l发现了:/usr/sbin/shutdown是指向/bin/systemctl的软链接。所以执行shutdown命令本质上是让systemctl处理关机/重启操作,而这类系统管理动作的权限不是单纯由文件权限决定的(哪怕链接权限是lrwxrwxrwx),而是由Polkit这个系统权限管理组件来管控的。本地用户免sudo的核心原因:Polkit的本地会话权限规则
当你在本地物理登录(或本地图形界面登录)时,Polkit会识别你属于「本地会话用户」。系统默认的Polkit规则里,通常会允许本地会话的普通用户执行关机、重启这类操作——比如针对org.freedesktop.login1.reboot、org.freedesktop.login1.power-off这些动作,本地用户会被直接授予权限,不需要额外输入sudo密码或做交互认证。远程SSH用户需要认证的原因:Polkit的远程会话限制
但通过SSH远程登录的用户,会被Polkit标记为「远程会话」。默认情况下,Polkit对远程用户执行这类系统级操作是做了限制的:要么要求你通过交互输入密码来临时获取权限,要么直接用root用户执行(root不受Polkit的普通权限规则约束),这就是你看到的报错Failed to schedule shutdown: Interactive authentication required.的由来。
你可以验证一下这个逻辑:去目标机器的/etc/polkit-1/rules.d/或/usr/share/polkit-1/rules.d/目录下,找和org.freedesktop.login1相关的规则文件,里面会明确区分本地、远程用户的权限差异。
备注:内容来源于stack exchange,提问作者mazda

