You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用polkit 0.106发送通知?开发U盘防忘拔关机锁定应用咨询

防遗忘U盘应用实现方案 + polkit 0.106通知发送指南

咱们先从核心的U盘连接时锁定关机功能说起,再解决polkit 0.106发送通知的问题:

一、实现关机拦截逻辑

1. 编写U盘检测脚本

先写一个脚本/usr/local/bin/check_usb_connected.sh,用来判断当前是否有U盘连接(这里以检测挂载在/media下的可移动存储为例,你可以根据需求调整):

#!/bin/bash

# 检测是否有挂载的可移动存储设备
has_usb=$(lsblk -o TYPE,MOUNTPOINT | grep -E 'part.*\/media' | wc -l)

if [ $has_usb -gt 0 ]; then
    # 存在U盘,返回非0值(告诉polkit拒绝关机)
    exit 1
else
    # 无U盘,允许关机
    exit 0
fi

给脚本加执行权限:

sudo chmod +x /usr/local/bin/check_usb_connected.sh

2. 配置polkit规则拦截关机

创建polkit规则文件/etc/polkit-1/rules.d/90-block-shutdown-with-usb.rules,内容如下:

polkit.addRule(function(action, subject) {
    // 匹配关机、重启、休眠等相关动作
    if (action.id.indexOf("org.freedesktop.login1.power-off") != -1 ||
        action.id.indexOf("org.freedesktop.login1.reboot") != -1 ||
        action.id.indexOf("org.freedesktop.login1.suspend") != -1) {
        
        // 调用检测脚本
        var result = polkit.spawn(["/usr/local/bin/check_usb_connected.sh"]);
        
        if (result != 0) {
            // 存在U盘,拒绝操作
            return polkit.Result.REJECT;
        }
    }
});

二、polkit 0.106发送桌面通知的方法

polkit进程以root身份运行,默认没有用户的桌面环境上下文(比如DISPLAY和DBUS_SESSION_BUS_ADDRESS变量),直接用notify-send会失败,得先获取当前登录用户的环境信息:

1. 修改检测脚本,加入通知逻辑

更新/usr/local/bin/check_usb_connected.sh,当检测到U盘时,发送提醒通知:

#!/bin/bash

# 检测是否有挂载的可移动存储设备
has_usb=$(lsblk -o TYPE,MOUNTPOINT | grep -E 'part.*\/media' | wc -l)

if [ $has_usb -gt 0 ]; then
    # 获取当前登录的普通用户(单用户场景适用,多用户可调整)
    USER=$(who | grep -v root | head -n1 | awk '{print $1}')
    # 获取用户UID
    UID=$(id -u $USER)
    # 获取用户DISPLAY(通常为:0)
    DISPLAY=$(who | grep -v root | head -n1 | awk '{print $NF}')
    # 获取用户DBUS会话地址(以GNOME为例,其他桌面换对应进程名)
    DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep -u $USER gnome-session | head -n1)/environ | cut -d= -f2-)
    
    # 切换到普通用户身份发送通知
    su - $USER -c "DISPLAY=$DISPLAY DBUS_SESSION_BUS_ADDRESS=$DBUS_SESSION_BUS_ADDRESS notify-send -u critical 'U盘防忘提醒' '请先拔除U盘再进行关机操作!'"
    
    # 返回非0值,让polkit拒绝关机
    exit 1
else
    exit 0
fi

2. 注意事项

  • 如果你的桌面环境不是GNOME,把gnome-session换成对应桌面的进程名(比如KDE的plasma-desktop,XFCE的xfce4-session)。
  • 多用户登录场景下,可遍历所有登录用户发送通知,或根据操作用户调整USER获取逻辑。
  • polkit 0.106支持polkit.spawn()调用外部脚本,把通知逻辑放在脚本里比在rules文件写复杂JS更直观。

测试验证

  1. 插入U盘,尝试关机/重启,系统会弹出提醒通知且无法执行关机操作。
  2. 拔除U盘后,关机功能恢复正常。

内容的提问来源于stack exchange,提问作者AlmuHS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:06:49