/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
当特定设备插入时,这只是被覆盖。