首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >systemd模板文件的Polkit规则-如何

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

Unix & Linux用户
提问于 2020-06-26 12:33:29
回答 1查看 1.4K关注 0票数 3

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

代码语言:javascript
复制
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使规则具有普遍性,下面是一些关键的、第三行规则的示例:

代码语言:javascript
复制
action.lookup("unit") == "my-daemon@*" &&
action.lookup("unit") == "my-daemon@[:alnum:]+" &&
action.lookup("unit") == "my-daemon@foo[0-9]" &&

上述任何一项都不起作用。在我看来,polkit不允许在这个地方出现regexp。我读过系统模板单元文件的Polkit规则,但这不是我的解决方案--作者正在测试文件名,而不是直接的单元名。我做错了什么?

这是我上一个问题控制系统作为用户的系统服务的延续,但是在我使用旧系统之前,甚至不可能编写静态规则。现在,这应该是可能的,而我正在不幸地失败。

代码语言:javascript
复制
OS Suse 12.5
Polkit version 0.113
Systemd version 228
EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2020-06-29 15:36:44

Uff。解决了这个问题,多亏了另一个程序员的帮助,他将链接发送到优秀的手册页面:https://www.freedesktop.org/software/polkit/docs/latest/polkit.8.htmlhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_表达式,后者解释了JavaScript编程语言中的相关内容。

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

代码语言: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将‘’中的正则表达式测试为另一个字符串,即请求服务名称的函数。希望它能帮助那些在类似问题上陷入困境的人。

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/595207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档