この質問の続きとして( polkit 0.106で通知を送信するにはどうすればよいですか? )、通知を送信するユーザーとしてnotify-send
を実行する必要があることがわかりました。
しかし、現在の設定では、polkitがスクリプトをpolkitd
userとして実行し、既知のユーザーパスワードがないとsu $user
を実行できないため、これを実行できません。
このため、polkitdの他のユーザーとしてnotify-send
を実行できるように、新しいpolkitアクションを作成する必要があります。
私のpolkitルールはこれです:
polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.consolekit.system.stop" ||
action.id == "org.freedesktop.login1.power-off" ||
action.id == "org.freedesktop.login1.power-off-multiple-sessions" ||
action.id == "org.xfce.session.xfsm-shutdown-helper")
{
try{
polkit.spawn(["/usr/bin/pendrive-reminder/check_pendrive.sh", subject.user]);
return polkit.Result.YES;
}catch(error){
polkit.spawn(["/usr/bin/pendrive-reminder/send_notify.sh", subject.user]);
return polkit.Result.NO;
}
}
});
このpolkitルールはシャットダウンメニューのシャットダウンオプションをロックする必要があり、これを実行するnotify-send
スクリプトとsend_notify.sh
スクリプトで通知を表示します。
#!/bin/bash
export DISPLAY=":0"
user=$1
pkexec --user $user notify-send "Pendrive Reminder" "Shutdown lock enabled. Disconnect pendrive to enable shutdown" -u critical
exit 0
私はこのpolkitポリシーファイルを追加しようとしました:
<policyconfig>
<action id="org.freedesktop.notify-send">
<description>Launch notify-send command</description>
<defaults>
<allow_any>yes</allow_any>
<allow_inactive>yes</allow_inactive>
<allow_active>yes</allow_active>
</defaults>
<annotate key="org.freedesktop.policykit.exec.path">/usr/bin/notify-send</annotate>
<annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
</action>
</policyconfig>
このファイルを/usr/share/polkit-1/actions/org.freedesktop.policykit.notify-send.policy
に入れました
しかし、ポリシーファイルを/usr/share/polkit-1/rules.d/
に入れてシャットダウンボタンを押した後、シャットダウンメニューが表示されるまでに時間がかかり、通知が表示されませんでした。シャットダウンオプションは正しくロックされています
Polkitがスクリプトからnotify-sendを呼び出すことができるようにするにはどうすればよいですか?
いくつかのテストを行った後、私はこの結果を得ました:
このコマンドを実行すると、polkitdユーザーでスクリプトを実行すると、エラーが表示されます。
Sudo su polkitd -s /bin/bash -c aux_scripts/send_notify.sh almu
Error executing command as another user: Not authorized
This incident has been reported.
ですから、polkitdユーザーは他のユーザーのようにコマンドを実行できない限定アカウントだと思います
結論として、このアクションはシステム内部を変更せずに実行することはできないと判断しました。アプリケーションでこれを許可できないため、polkitから別のユーザーとしてコマンドを起動できません