使用 udev 规则在 USB 插入时运行脚本

使用 udev 规则在 USB 插入时运行脚本

我正在尝试设置一个脚本,每次插入 USB 设备时都会运行。我创建了文件/etc/udev/rules.d/90-local.rules并添加了以下规则:

ACTION=="add", SUBSYSTEM=="usb", KERNEL=="sd*", SYSFS{model}=="Cruzer*", RUN+="sh /home/jesse/Documents/Scripts/cruzer.sh"

问题是,当驱动器连接时,什么都没有发生。出于调试目的,脚本被设计为使用notify-send发送通知,该程序已安装并从终端正常运行。

脚本的路径是正确的,因为我已经在终端中毫无问题地运行了该精确的命令。

答案1

我也遇到了同样的问题。这对我有用:

尝试将您的脚本复制到/usr/local/bin您的文件中并更改该目录.rules

另外,我不知道 SYSFS 是什么,但我更喜欢使用 ATTR 属性。

以下行是我的.rules文件的内容:

ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd[a-z]1", ATTRS{vendor}=="SanDisk ", RUN+="/usr/local/bin/backup.sh"

答案2

notify-send需要访问你的 DBus 会话总线,但由于以下两个原因,它无法访问该总线:

  • 没有关于会话的信息。当由 udev 启动时,你的脚本知道没有什么关于您登录的位置或是否登录。使用 X11 的多席位仍然很棘手,但用户切换适用于 X11 和控制台会话。许多人还通过网络使用 SSH、VNC 和 NX。

    DISPLAY=:0有一半的时间会起作用,但那仍然猜测最好。)

  • DBus 策略拒绝。即使您的脚本以某种方式找到您的 X11 会话,它也无法发送通知,因为脚本是以root您的用户帐户而不是您的用户帐户运行的。

答案3

您可以尝试通过供应商和产品 ID 来匹配设备。以下自定义规则对我有用:

ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="0763", ATTR{idProduct}=="019b", RUN+="/usr/bin/aconnect 20 128"

连接设备后,您可以在 lsusb 输出或 dmesg 中看到 idVendor 和 idProduct。

答案4

也许,您可能需要在脚本中添加一个sleep,以便让 USB 设备有机会“安顿下来”?例如,USB 3G 调制解调器,模式切换以使 /dev/ttyUSB 由内核启动并运行。

相关内容