kfi*_*rba 5 bash usb udev 14.04
每当插入 USB 时,我都会尝试执行脚本。我目前拥有的是一个演示脚本/usr/local/test.sh:
#!/bin/bash
touch /home/kfir/test.txt
Run Code Online (Sandbox Code Playgroud)
我还有一个规则文件,它试图匹配以下任何 USB /etc/udev/rules.d/100-usb.rules:
ACTION=="add", ATTRS{idVendor}=="****", ATTRS{idProduct}=="****", RUN+="/usr/local/test.sh"
Run Code Online (Sandbox Code Playgroud)
问题是该test.txt文件从未被创建。我也收到以下错误:
我现在不知道该怎么办。我想要实现的很简单,当有 USB 存储设备被插入时,运行一个简单的脚本(在这种情况下创建一个 test.txt 文件)。
PStest.sh文件工作正常。当我手动运行它时,它会创建test.txt文件。
每个 USB 设备?使用这个简单的行/etc/udev/rules.d/100-usb.rules
ACTION=="add", RUN+="/bin/mkdir /tmp/folder1"
Run Code Online (Sandbox Code Playgroud)
并重新启动 udev
sudo service udev restart
Run Code Online (Sandbox Code Playgroud)
这是消耗品
ATTRS{idVendor}=="****", ATTRS{idProduct}=="****",
Run Code Online (Sandbox Code Playgroud)
这些ATTRS{idVendor}=="****", ATTRS{idProduct}=="****"目标是任何东西,您可以将它们从规则中删除。
然而,这样它就会被许多树节点和所有设备(甚至非 USB 设备)触发。
尝试此规则,该规则仅针对单个节点且仅 USB 设备:
ACTION=="add", SUBSYSTEM=="usb", DRIVER=="usb", RUN+="/usr/local/test.sh"
Run Code Online (Sandbox Code Playgroud)我是怎么得到的:
udevadm monitor -u插入闪存驱动器,它的输出与此相同:
UDEV [13394.985946] add /devices/pci0000:00/0000:00:14.0/usb1/1-3 (usb)
UDEV [13394.991173] add /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0 (usb)
UDEV [13394.992509] add /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/host9 (scsi)
UDEV [13394.993436] add /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/host9/scsi_host/host9 (scsi_host)
UDEV [13395.978250] add /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/host9/target9:0:0 (scsi)
UDEV [13395.979665] add /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/host9/target9:0:0/9:0:0:0 (scsi)
UDEV [13395.980363] add /devices/virtual/bdi/8:32 (bdi)
UDEV [13395.981822] add /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/host9/target9:0:0/9:0:0:0/scsi_disk/9:0:0:0 (scsi_disk)
UDEV [13395.982998] add /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/host9/target9:0:0/9:0:0:0/bsg/9:0:0:0 (bsg)
UDEV [13395.983447] add /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/host9/target9:0:0/9:0:0:0/scsi_device/9:0:0:0 (scsi_device)
UDEV [13395.983970] add /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/host9/target9:0:0/9:0:0:0/scsi_generic/sg4 (scsi_generic)
UDEV [13396.473531] add /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/host9/target9:0:0/9:0:0:0/block/sdc (block)
UDEV [13396.528471] add /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/host9/target9:0:0/9:0:0:0/block/sdc/sdc1 (block)
Run Code Online (Sandbox Code Playgroud)使用头节点检查其属性:
udevadm info -a --path=/sys/devices/pci0000:00/0000:00:14.0/usb1/1-3
Run Code Online (Sandbox Code Playgroud)
输出:
Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.
looking at device '/devices/pci0000:00/0000:00:14.0/usb1/1-3':
KERNEL=="1-3"
SUBSYSTEM=="usb"
DRIVER=="usb"
ATTR{bDeviceSubClass}=="00"
ATTR{bDeviceProtocol}=="00"
ATTR{devpath}=="3"
ATTR{idVendor}=="125f"
ATTR{speed}=="480"
ATTR{bNumInterfaces}==" 1"
ATTR{bConfigurationValue}=="1"
ATTR{bMaxPacketSize0}=="64"
ATTR{busnum}=="1"
ATTR{devnum}=="5"
ATTR{configuration}==""
ATTR{bMaxPower}=="98mA"
ATTR{authorized}=="1"
ATTR{bmAttributes}=="80"
ATTR{bNumConfigurations}=="1"
ATTR{maxchild}=="0"
ATTR{bcdDevice}=="0100"
ATTR{avoid_reset_quirk}=="0"
ATTR{quirks}=="0x0"
ATTR{serial}=="2b712383811292"
ATTR{version}==" 2.00"
ATTR{urbnum}=="673"
ATTR{ltm_capable}=="no"
ATTR{manufacturer}=="ADATA"
ATTR{removable}=="unknown"
ATTR{idProduct}=="c96a"
ATTR{bDeviceClass}=="00"
ATTR{product}=="ADATA USB Flash Drive"
Run Code Online (Sandbox Code Playgroud)现在,我们只检查 1 个设备,如果我们检查更多设备:手机、鼠标...我们会发现,对于所有 USB 设备都是相同的SUBSYSTEM=="usb"。DRIVER=="usb"所以它们可以用于规则匹配。