如何在USB设备接入PC时触发bash脚本并实现设备授权?
USB设备接入自动授权实现方案
一、编写udev规则
udev规则用于监听USB设备接入事件,并触发授权脚本。
创建规则文件:
在/etc/udev/rules.d/目录下新建99-usb-authorization.rules文件,内容如下:SUBSYSTEM=="usb", ACTION=="add", DEVTYPE=="usb_device", ATTR{authorized}="0", RUN+="/usr/local/bin/usb-auth.sh $idVendor $idProduct $devpath"规则说明:
SUBSYSTEM=="usb":匹配USB子系统设备ACTION=="add":仅在设备接入时触发DEVTYPE=="usb_device":排除USB集线器,仅针对实际USB设备ATTR{authorized}="0":默认禁用设备,防止未授权使用RUN+="/usr/local/bin/usb-auth.sh ...":调用授权脚本,传入厂商ID、产品ID和设备路径
重新加载udev规则:
udevadm control --reload-rules && udevadm trigger
二、编写bash授权脚本
脚本接收udev传递的设备参数,通过zenity弹窗询问用户授权,并根据选择控制设备权限。
创建脚本文件:
在/usr/local/bin/目录下新建usb-auth.sh,内容如下:#!/bin/bash # 接收udev传递的参数 VENDOR_ID=$1 PRODUCT_ID=$2 DEVPATH=$3 # 获取设备制造商和产品名称(从sysfs读取) MANUFACTURER=$(cat /sys/bus/usb/devices/$DEVPATH/manufacturer 2>/dev/null || echo "未知") PRODUCT=$(cat /sys/bus/usb/devices/$DEVPATH/product 2>/dev/null || echo "未知") # 获取当前登录用户的X会话信息(确保zenity能正常显示GUI弹窗) USER=$(who | grep -E '(:[0-9]+)' | head -n1 | awk '{print $1}') DISPLAY=$(who | grep -E '(:[0-9]+)' | head -n1 | awk '{print $NF}') XAUTHORITY="/home/$USER/.Xauthority" # 导出环境变量,供zenity使用 export DISPLAY export XAUTHORITY # 显示授权弹窗 sudo -u $USER zenity --question \ --title="USB设备授权" \ --text="检测到新USB设备接入:\n\n制造商:$MANUFACTURER\n产品名称:$PRODUCT\n厂商ID:$VENDOR_ID\n产品ID:$PRODUCT_ID\n\n是否授权该设备使用?" # 根据用户选择设置设备权限 if [ $? -eq 0 ]; then # 用户选择授权:启用设备 echo 1 > /sys/bus/usb/devices/$DEVPATH/authorized else # 用户拒绝授权:保持设备禁用 echo 0 > /sys/bus/usb/devices/$DEVPATH/authorized fi设置脚本可执行权限:
chmod +x /usr/local/bin/usb-auth.sh
三、功能说明
- 当任何USB设备(U盘、鼠标、键盘等)接入时,udev会立即禁用设备,并触发授权脚本
- 脚本读取设备信息并通过zenity弹窗展示给用户,询问是否授权
- 用户点击"是":设备被启用,可正常使用;点击"否":设备保持禁用状态
注意事项
- 仅适用于带GUI的桌面环境(依赖zenity)
- 若多用户登录,脚本默认选择第一个登录用户的会话显示弹窗
- 部分特殊设备可能需要额外配置(如加密存储设备),但基础授权逻辑通用
内容的提问来源于stack exchange,提问作者simdll
相关产品推荐
相关产品推荐

