![允许非 root 用户使用 polkit 规则无需密码即可运行某些 systemd 服务(不是 *)](https://linux22.com/image/723373/%E5%85%81%E8%AE%B8%E9%9D%9E%20root%20%E7%94%A8%E6%88%B7%E4%BD%BF%E7%94%A8%20polkit%20%E8%A7%84%E5%88%99%E6%97%A0%E9%9C%80%E5%AF%86%E7%A0%81%E5%8D%B3%E5%8F%AF%E8%BF%90%E8%A1%8C%E6%9F%90%E4%BA%9B%20systemd%20%E6%9C%8D%E5%8A%A1%EF%BC%88%E4%B8%8D%E6%98%AF%20*%EF%BC%89.png)
我有一个非 root 用户,我需要能够启动/停止/重新启动系统上的服务子集,而无需提示输入授权密码。理想情况下,我希望通过 polkit 完成此操作,但如果需要,我会选择 sudo。无论如何,我在这里看到了解决方案,包括向 localauthority 添加文件并添加 .rules 文件以/etc/polkit-1/rules.d
指定要运行的服务。我应该提到这是在 CentOS7 系统上。
然而,地方当局的解决方案是全部服务和 .rules 文件解决方案(取自此处:systemd:授予非特权用户更改一项特定服务的权限) 仍将提示输入密码,因为中的“manage-units”操作设置为“auth_admin” /usr/share/polkit-1/actions/org.freedesktop.systemd1.policy
。
有没有办法让 polkit 允许特定用户无需密码即可运行特定服务?无需为该用户提供管理单元操作的完全开放权限?我基本上想要有条件的管理单元权限。
我还注意到一些有趣的事情:如果我运行这个函数
polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.systemd1.manage-units" && subject.user == "alice")
{
return polkit.Result.YES;
}
});
它对所有服务都有效。但如果我尝试通过将其更改为以下内容来深入了解服务:
polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.systemd1.manage-units" &&
action.lookup("unit") == "example.service" &&
subject.user == "alice") {
return polkit.Result.YES;
}
});
突然它提示输入密码。不知道为什么它不会在第一个函数中提示输入密码,因为它仍然按照管理单元操作进行操作。