如何创建udev规则以在插入USB存储设备时运行脚本?
如何通过udev规则实现插入USB存储设备时自动运行脚本
步骤1:准备可执行脚本
先写好要运行的Shell或Python脚本,确保赋予可执行权限。
示例Shell脚本
创建/usr/local/bin/usb-trigger.sh:
#!/bin/bash # 脚本逻辑示例:记录USB插入事件到日志 echo "USB存储设备插入,时间:$(date)" >> /var/log/usb-action.log
示例Python脚本
创建/usr/local/bin/usb-trigger.py:
#!/usr/bin/env python3 import datetime with open('/var/log/usb-action.log', 'a') as log_file: log_file.write(f"USB存储设备插入,时间:{datetime.datetime.now()}\n")
添加可执行权限:
sudo chmod +x /usr/local/bin/usb-trigger.sh # 若用Python脚本则执行: sudo chmod +x /usr/local/bin/usb-trigger.py
步骤2:创建udev规则文件
在/etc/udev/rules.d/目录下新建规则文件(文件名前缀数字决定执行优先级,数字越小优先级越高),比如99-usb-auto-run.rules:
sudo nano /etc/udev/rules.d/99-usb-auto-run.rules
基础规则(匹配所有USB存储设备)
添加以下内容:
# 匹配USB存储块设备插入事件 ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd*[!0-9]", RUN+="/usr/local/bin/usb-trigger.sh"
精准匹配特定USB设备(可选)
如果只想触发特定设备,先通过lsusb查看设备的厂商ID和产品ID,再修改规则:
# 替换xxxx/yyyy为你的设备ID ACTION=="add", SUBSYSTEM=="block", ATTRS{idVendor}=="xxxx", ATTRS{idProduct}=="yyyy", RUN+="/usr/local/bin/usb-trigger.sh"
规则参数说明
ACTION=="add":仅在设备插入(添加)时触发SUBSYSTEM=="block":匹配块设备(存储设备属于此类)KERNEL=="sd*[!0-9]":匹配主设备节点(如sdb,而非分区sdb1),若要匹配分区则改为KERNEL=="sd*[0-9]"RUN+="/path/to/script":指定要执行的脚本路径,RUN+表示追加执行,不会覆盖其他规则的命令
步骤3:重载udev规则使生效
修改规则后,执行以下命令重载:
sudo udevadm control --reload-rules sudo udevadm trigger
关键注意事项
- udev执行脚本时环境变量极少,脚本内所有路径务必用绝对路径(比如用
/usr/bin/python3而非python3) - 避免在脚本中执行长时间任务,udev会等待脚本完成,可能导致设备挂载延迟
- 若脚本需要访问桌面资源(如X11),需通过
su - 用户名 -c "命令"切换到对应用户执行 - 可用
udevadm monitor命令实时查看udev事件,调试规则是否正常触发
内容的提问来源于stack exchange,提问作者Abhishek
相关产品推荐
相关产品推荐

