作为这个问题的延续(如何使用 polkit 0.106 发送通知?),我发现我必须以notify-send
要发送通知的用户身份执行。
但是,使用我当前的配置,我不能这样做,因为 polkit 以polkitd
用户身份执行脚本,而且我不能su $user
没有已知的用户密码。
因此,我需要创建一个新的 polkit 操作,以允许notify-send
从 polkitd 以其他用户身份执行。
我的 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?