如何用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更直观。
测试验证
- 插入U盘,尝试关机/重启,系统会弹出提醒通知且无法执行关机操作。
- 拔除U盘后,关机功能恢复正常。
内容的提问来源于stack exchange,提问作者AlmuHS
相关产品推荐
相关产品推荐

