我试图允许用户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;
}
}
});
然而,我使用的是 Debianstretch/buster,我们polkit 0.105
自 2012 年以来 一直使用该版本。polkit(<0.106)
不支持这些rules.d/*
文件。相反,我们依赖/etc/polkit-1/localauthority/50-local.d/*.pkla
.
以下是一些例子PK地方当局(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
和systemctl edit
,但仍然失败(这很好)。所以action.lookup("verb")
可能不是必需的,但action.lookup("unit")
仍然相当重要。
关于这个主题有很多悬而未决的问题:
答案1
这是不可能的。此功能仅针对 .rules-variant 实现
答案2
但适用于用户:
sudo cat /etc/polkit-1/localauthority/50-local.d/54-manage-units.pkla
[systemd]
Identity=unix-user:pi
Action=org.freedesktop.systemd1.manage-units
ResultAny=yes
ResultInactive=yes
ResultActive=yes
事实上,这是让它在 raspian 上工作的唯一方法,因为出于某种奇怪的原因,它不遵守用 javascript 编写的 polkit 规则。