特定のユーザーが特定のサービスを開始/停止/再開できるようにするために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そして他のパラメータと一緒には機能しません。
ルールを一般化するために正規表現を使ってみました。以下は、ルールの主な3行目の例です。
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 プログラミング言語について説明します。
予想通り、サービス名を処理する1行だけ変更しました。
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は「」内の正規表現を別の文字列でテストします。これはサービス名を求める関数です。同様の問題を抱えている他の人にも役立つことを願っています。