AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 425211
Accepted
AlmuHS
AlmuHS
Asked: 2018-02-20 07:30:32 +0800 CST2018-02-20 07:30:32 +0800 CST 2018-02-20 07:30:32 +0800 CST

如何使用 polkit 0.106 发送通知?

  • 772

我正在开发一个应用程序,不要忘记 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'
linux shutdown
  • 3 3 个回答
  • 538 Views

3 个回答

  • Voted
  1. mviereck
    2018-02-20T10:11:20+08:002018-02-20T10:11:20+08:00

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

    从pkexec 手册页:

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

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

    但是,核心点是提供DISPLAY和XAUTHORITY为notify-send.

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


    编辑:基于上面的讨论,一种解决方法应该适用于多个用户并且没有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)
    
    • 0
  2. AlmuHS
    2018-02-26T11:20:28+08:002018-02-26T11:20:28+08:00

    @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

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

    • 0
  3. Best Answer
    AlmuHS
    2018-03-24T15:48:00+08:002018-03-24T15:48:00+08:00

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

    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 客户端,通知显示正确

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

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

    • 0

相关问题

  • 有没有办法让 ls 只显示某些目录的隐藏文件?

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

  • 需要一些系统调用

  • astyle 不会更改源文件格式

  • 通过标签将根文件系统传递给linux内核

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve