我正在开发一个应用程序,不要忘记 pendrive。
如果 pendrive 连接到机器,此应用程序必须锁定关机。在这种形式中,如果用户想在连接笔式驱动器时关闭系统,系统会显示一条通知,提醒它必须断开笔式驱动器才能解锁关机。
为了检测关机事件,我设置了一个 polkit 规则,它调用一个脚本来检查是否有任何 pendrive 连接到系统。
如果有任何 pendrive 连接,则 polkit 规则通过脚本调用 notify-send,该脚本send_notify.sh
执行以下命令:
notify-send "Pendrive-Reminder" "Extract Pendrive to enable shutdown" -t 5000
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
没有向我的用户显示通知。
我该如何解决这个问题?
更新:
我试图修改脚本是这样的:
#!/bin/bash
user=$1
XAUTHORITY="/home/$user/.Xauthority"
DISPLAY=$( who | grep -m1 $user.*\( | awk '{print $5}' | sed 's/[(|)]//g')
notify-send "Extract Pendrive to enable shutdown" -t 5000
exit 0
用户由 pòlkit 作为参数传递
但问题还在继续
更新:我刚刚看到这个错误https://bugs.launchpad.net/ubuntu/+source/libnotify/+bug/160598不允许以 root 身份发送通知。
稍后我将测试修改解决方法更改用户
UPDATE2:将代码更改为此之后。问题继续存在:
#!/bin/bash
export XAUTHORITY="/home/$user/.Xauthority"
export DISPLAY=$(cat "/tmp/display.$user")
user=$1
su $user -c 'notify-send "Pendrive Reminder" "Shutdown lock enabled. Disconnect pendrive to enable shutdown" -u critical'
polkit(和
pkexec
)删除环境变量DISPLAY
和XAUTHORITY
X 访问所需的变量。notify-send
失败,因为它无法访问显示。从pkexec 手册页:
我对 polkit 不熟悉;也许你可以
org.freedesktop.policykit.exec.allow_gui
只为这个规则设置,或者还有其他的可能性。抱歉,我无法提供现成的解决方案。但是,核心点是提供
DISPLAY
和XAUTHORITY
为notify-send
.(不要打我:一个肮脏的解决方案将是硬编码
DISPLAY=:0
并XAUTHORITY=...
在您的通知脚本中。请注意,如果发生变化,这可能会失败)。编辑:基于上面的讨论,一种解决方法应该适用于多个用户并且没有
XAUTHORITY
:在 X 登录时,应该自动执行一个脚本(可能
.desktop
在 中进行一些设置~/.config/autostart
):在你的 polkit 脚本中包括
@mviereck
我试图用这个内容创建一个 polkit 策略文件来通知发送
我把这个文件放在
/usr/share/polkit-1/actions/org.freedesktop.policykit.notify-send.policy
但是,按下关机按钮后,关机菜单需要很长时间才能显示,并且没有出现通知
最后,我创建了一个 dbus 客户端,以用户身份启动,它接收来自 systembus 的信号并向用户显示通知。
dbus 客户端代码位于https://github.com/AlmuHS/Pendrive_Reminder/blob/work-in-progress/dbus-client/client.py
在
send-notify.sh
脚本中,我只添加了以用户身份执行 dbus 客户端,通知显示正确
现在我尝试当用户连接 pendrive 时客户端可以自动启动
继续如何从脚本启动 dbus 客户端?