我试图使用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") == "my-daemon@foo1.service" &&
subject.user == "user1") {
return polkit.Result.YES;
}但是,它是用于静态参数foo1的,并且它不会与任何其他参数一起工作。
我尝试使用regexp使规则具有普遍性,下面是一些关键的、第三行规则的示例:
action.lookup("unit") == "my-daemon@*" &&
action.lookup("unit") == "my-daemon@[:alnum:]+" &&
action.lookup("unit") == "my-daemon@foo[0-9]" &&上述任何一项都不起作用。在我看来,polkit不允许在这个地方出现regexp。我读过系统模板单元文件的Polkit规则,但这不是我的解决方案--作者正在测试文件名,而不是直接的单元名。我做错了什么?
这是我上一个问题控制系统作为用户的系统服务的延续,但是在我使用旧系统之前,甚至不可能编写静态规则。现在,这应该是可能的,而我正在不幸地失败。
OS Suse 12.5
Polkit version 0.113
Systemd version 228发布于 2020-06-29 15:36:44
Uff。解决了这个问题,多亏了另一个程序员的帮助,他将链接发送到优秀的手册页面:https://www.freedesktop.org/software/polkit/docs/latest/polkit.8.html和https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_表达式,后者解释了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将‘’中的正则表达式测试为另一个字符串,即请求服务名称的函数。希望它能帮助那些在类似问题上陷入困境的人。
https://unix.stackexchange.com/questions/595207
复制相似问题