특정 사용자가 특정 서비스를 시작/중지/다시 시작하도록 허용하기 위해 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]" &&
위의 어느 것도 작동하지 않습니다. 제 생각에는 폴킷이 그렇습니다아니요여기서는 정규 표현식이 허용됩니다. 내가 읽고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_ExpressionsJavaScript 프로그래밍 언어에 대해 설명합니다.
예상대로 서비스 이름을 처리하는 한 줄만 변경했습니다.
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는 ' ' 안의 정규식을 다른 문자열로 테스트하는데, 이는 서비스 이름을 묻는 함수입니다. 비슷한 문제에 봉착한 다른 사람들에게도 도움이 되기를 바랍니다.