我正在尝试允许 a 的用户somegroup
管理someunit
systemd 服务。
在polkit (>=0.106)
中,这可以通过添加规则来完成:
/etc/polkit-1/rules.d/20-someunit.rules
---
polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.systemd1.manage-units"
&& subject.isInGroup("somegroup")
&& (action.lookup("unit") == "someunit.service") )
{
var verb = action.lookup("verb");
if (verb == "start" || verb == "stop" || verb == "restart") {
return polkit.Result.YES;
}
}
});
但是,我polkit 0.105
自 2012 年以来一直在使用 Debian stretch/buster。polkit(<0.106)
不支持这些rules.d/*
文件。相反,我们依赖/etc/polkit-1/localauthority/50-local.d/*.pkla
.
按照pklocalauthority(8)中的一些示例,我可以在等效的 pkla 文件中完成大部分工作:
/etc/polkit-1/localauthority/50-local.d/manage-units.pkla
----
[Allow users to manage services]
Identity=unix-group:somegroup
Action=org.freedesktop.systemd1.manage-units
ResultActive=yes
但是,这会授予对所有服务的所有操作的访问权限。是否有等效于允许特定action.lookup()
功能的方法?
我确实尝试过systemctl enable
and systemctl edit
,但都失败了(这很好)。所以action.lookup("verb")
可能不是必需的,但action.lookup("unit")
仍然非常重要。
关于这个主题有很多悬而未决的问题:
这是不可能的。此功能仅针对 .rules-variant 实现
https://github.com/systemd/systemd/pull/1159
虽然适用于用户:
事实上,这是让它在 raspian 上工作的唯一方法,因为出于某种奇怪的原因,它不遵守用 javascript 编写的 polkit 规则。