如何使用 polkit 0.106 发送通知?

如何使用 polkit 0.106 发送通知?

我正在开发一个应用程序,以免忘记随身碟。

如果随身碟连接到机器,此应用程序必须锁定关机。在这种形式下,如果用户想要在连接随身碟时关闭系统,系统会显示一条通知,提醒必须断开随身碟才能解锁关机。

为了检测关闭事件,我设置了一个 polkit 规则,该规则调用脚本来检查是否有任何随身碟连接到系统。

如果连接了任何笔驱动器,polkit 规则会通过脚本调用通知发送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'

答案1

polkit(和pkexec)删除X 访问所需的环境变量DISPLAY和。失败,因为它无法访问显示。XAUTHORITYnotify-send

来自pkexec 联机帮助页:

因此,pkexec 将不允许您以其他用户身份运行 X11 应用程序,因为未设置 $DISPLAY 和 $XAUTHORITY 环境变量。如果操作上的 org.freedesktop.policykit.exec.allow_gui 注释设置为非空值,这两个变量将被保留

我不熟悉 polkit;也许你可以org.freedesktop.policykit.exec.allow_gui只设置这个规则,或者还有其他可能性。抱歉,我无法提供现成的解决方案。

然而,核心点是提供DISPLAYXAUTHORITYnotify-send

(不要打我:肮脏的解决方案将是硬编码DISPLAY=:0XAUTHORITY=...在您的通知脚本中。请注意,如果发生变化,这可能会失败)。


编辑:根据上面的讨论,一种解决方法应该适用于多个用户,并且不需要XAUTHORITY

在 X 登录时,应该自动执行一个脚本(可能.desktop在 中进行了一些设置~/.config/autostart):

#! /bin/bash
# allow polkitd access to X. 
# xhost is an alternative to XAUTHORITY authentication
xhost +SI:localuser:polkitd
# store DISPLAY for each user
echo $DISPLAY > /tmp/display.$USER

在你的 polkit 脚本中包括

export DISPLAY=$(cat /tmp/display.$user)

答案2

@mviereck

我尝试创建一个 polkit 策略文件来通知发送,其中包含以下内容

<policyconfig>
<action id="org.freedesktop.notify-send">
<description>Launch notify-send command</description>
<message>Authentication is required to run the gedit</message>
<icon_name>accessories-text-editor</icon_name>
<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>

我把这个文件放入/usr/share/polkit-1/actions/org.freedesktop.policykit.notify-send.policy

但是,按下关机按钮后,关机菜单花了很长时间才显示,并且没有出现通知

答案3

最后,我创建了一个 dbus 客户端,以用户身份启动,它接收来自系统总线的信号并向用户显示通知。

dbus客户端代码位于https://github.com/AlmuHS/Pendrive_Reminder/blob/work-in-progress/dbus-client/client.py

send-notify.sh脚本中,我只添加了

 dbus-send --system /org/preminder/mensaje org.preminder.App

以用户身份执行 dbus 客户端,通知正确显示

现在我尝试当用户连接随身碟时客户端可以自动启动

继续进入如何从脚本启动 dbus 客户端?

相关内容