作为这个问题的延续(如何使用 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 可以从我的脚本中调用 notification-send ?
答案1
经过一些测试,我得到了这个结果:
- polkitd 是 nologin 用户
如果我执行此命令,以 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 中的另一个用户身份启动命令