Ubuntu 上的 udev 无法用于 USB 插入

Ubuntu 上的 udev 无法用于 USB 插入

/usr/local/bin/USBTesting.sh我正在尝试执行一项“简单”任务,即在插入特定 USB 设备时运行脚本。我创建它/lib/udev/rules.d/99-USBTesting.rules /etc/udev/rules.d/10-USBTesting.rules是因为我不知道应该把它们放在哪里。对于这些文件的内容,我使用了以下所有内容(逐一):

ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="18a5", ATTRS{idProduct}=="0304", RUN+="/usr/local/bin/USBTesting.sh"
ACTION==“add”, SUBSYSTEM==“usb_device”, SYSFS{idVendor}==“18a5”, SYSFS{idProduct}==“0304”, RUN+=“/usr/local/bin/USBTesting.sh”
ACTION=="add", KERNEL=="sd[a-z]*", RUN+=“/usr/local/bin/USBTesting.sh”
SYSFS{idVendor}==“18a5”, SYSFS{idProduct}==“0304”, RUN+=“/usr/local/bin/USBTesting.sh”
ACTION==“add”, SUBSYSTEM==“usb_device”, RUN+=“/usr/local/bin/USBTesting.sh”
ACTION==“add”, KERNEL=="sd*[!0-9]", RUN+=“/usr/local/bin/USBTesting.sh”
ATTRS{model}=="STORE N GO      ", ATTRS{vendor}=="Verbatim", RUN+=“/usr/local/bin/USBTesting.sh”
SUBSYSTEM=="usb", ATTRS{idVendor}=="18a5", ATTRS{idProduct}=="0304", RUN+="/usr/local/bin/USBTesting.sh"
KERNEL=="*", RUN+=“/usr/local/bin/USBTesting.sh”

当然,我还发出了臭名昭著的警告sudo udevadm control --reload-rules,甚至“以防万一”重启了我的笔记本电脑几次。

的内容/usr/local/bin/USBTesting.sh

#!/bin/sh -e
set -u

echo $(date) Started >> /tmp/USBTesting.txt
echo $(date) Started >> /home/elemer/USBTesting.txt

没什么复杂的,目前只是测试一下。sudo chmod +x /usr/local/bin/USBTesting.sh已应用。如果我运行/usr/local/bin/USBTesting.sh它,它会执行应有的操作。

我真的没什么主意了。有人在 ubuntu 14.04.1 LTS 上成功实现过类似功能吗?想听听正确的解决方案。

编辑: RUN+=“/usr/local/bin/USBTesting.sh”这是我的 udev 规则中RUN+="/usr/local/bin/USBTesting.sh"正确的一个未经训练的眼睛(比如我)不会发现差异。"是不同的。看起来它造成了差异。

我的新 udev 规则如下所示: SUBSYSTEM=="usb", ATTRS{serial}=="f88331611c905b", RUN+="/usr/local/bin/USBTesting.sh"

SUBSYSTEM=="usb", ATTRS{idVendor}=="18a5", ATTRS{serial}=="f88331611c905b", ATTRS{manufacturer}=="Verbatim", ATTRS{idProduct}=="0304", RUN+="/usr/local/bin/USBTesting.sh" -- 从udevadm info -a -n sdc-- 获得这些信息可能需要更改sdc为您自己的。

现在我的脚本对于每个插件都会被触发两次。

编辑 2:事实证明我必须添加ENV{DEVTYPE}=="usb_device"规则,现在它只执行一次。这就是我的规则现在的样子。

SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="18a5", ATTRS{serial}=="f88331611c905b", ATTRS{manufacturer}=="Verbatim", ATTRS{idProduct}=="0304", RUN+="/usr/local/bin/USBTesting"

答案1

我尝试了类似的东西,而且成功了。你是不是在运行 VirtualBox?我在让 USB 端口保持活动状态时遇到了问题,但本机机器 Ubuntu 14.04 和 4.0.5+ 内核似乎工作正常。我的不同之处在于简化了你必须做的事情 (60-usb.rules):

RUN+=“/usr/local/bin/USBTesting.sh”

我重用了您的脚本来打印到 /tmp/USBtesting.txt。此外,唯一额外的命令是:

$ sudo service udev restart

完成此操作后,每个插件都会写入 USBtesting.txt 6 次。如果直接运行脚本,您的 USBtesting.txt 文件会被调用吗?

答案2

在 Ubuntu 14.04.3 LTS 上,sudo service udev restart关键的是:

到处都有 udev 文档udev 会监视/etc/udev/rules.d/变化,但这是不是此发行版下的情况如此,因此每次更改规则时都需要重新启动。

让我整天拉长头发!谢谢 Crizzo!

我的/etc/udev/rules.d/test.rules:(全部一行) ACTION=="add", SUBSYSTEMS=="usb", ENV{ID_SERIAL}=="Lattice_Lattice_FTUSB_Interface_Cable", RUN+="/bin/sh -c 'echo blah > /var/log/test'"

/var/log/test当特定设备插入时,这只是被覆盖。

相关内容