systemd 模板文件的 Polkit 规则 - 如何

systemd 模板文件的 Polkit 规则 - 如何

我正在尝试使用 polkit 来允许特定用户启动/停止/重新启动特定服务。这些服务是通过 systemd 模板定义的,因此例如用户可以运行以下命令: systmctl stop my-daemon@<parameter>.service。参数是用户定义的字母数字字符串。这个 polkit 规则完美运行:

polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.systemd1.manage-units" &&
    action.lookup("unit") == "[email protected]" &&
    subject.user == "user1") {
    return polkit.Result.YES;
}

然而,这是为了静止的范围,富1并且它不适用于任何其他参数。

我已尝试使用正则表达式使规则变得通用,以下是规则的关键第三行的一些示例:

action.lookup("unit") == "my-daemon@*" &&
action.lookup("unit") == "my-daemon@[:alnum:]+" &&
action.lookup("unit") == "my-daemon@foo[0-9]" &&

以上都不起作用。在我看来 polkit 确实如此不是允许在这个地方使用正则表达式。我读过了systemd 模板单元文件的 Polkit 规则,但这对我来说不是一个解决方案 - 作者正在测试文件名,而不是直接测试单元名称。我究竟做错了什么?

这是我之前问题的延续以用户身份控制systemd系统服务,但是在我使用旧的 systemd 之前,甚至无法编写静态规则。现在应该可以了,但我却失败得很惨。

OS Suse 12.5
Polkit version 0.113
Systemd version 228

答案1

呃。解决了这个问题,感谢另一位程序员的帮助,他发送了良好手册页的链接:https://www.freedesktop.org/software/polkit/docs/latest/polkit.8.html 并且主要是https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions它解释了 JavaScript 编程语言的相关内容。

正如预期的那样,我只更改了处理服务名称的一行。

polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.systemd1.manage-units" &&
    RegExp('my-daemon@[A-Za-z0-9_-]+.service').test(action.lookup("unit")) === true &&
    subject.user == "foo1") {
    return polkit.Result.YES;
}
});

RegExp() 是一个函数,该行中间的 .test 将 ' ' 中的正则表达式测试为另一个字符串,该字符串是询问服务名称的函数。希望它能帮助其他陷入类似问题的人。

相关内容