web-dev-qa-db-ja.com

すべてのUSBデバイスを対象とするudevルール

USBが接続されるたびにスクリプトを実行しようとしています。私が現在持っているのは、/usr/local/test.shのデモスクリプトです:

#!/bin/bash

touch /home/kfir/test.txt

/etc/udev/rules.d/100-usb.rules内の任意のUSBに一致させようとするルールファイルもあります。

ACTION=="add", ATTRS{idVendor}=="****", ATTRS{idProduct}=="****", RUN+="/usr/local/test.sh"

問題は、test.txtファイルが作成されないことです。また、次のエラーが表示されます。

error message

今何をすればいいのか分からない。私が達成したいのはかなり簡単です。USBストレージデバイスが接続されている場合、簡単なスクリプトを実行します(この場合はtest.txtファイルを作成します)。

追伸test.shファイルは正常に機能しています。手動で実行すると、test.txtファイルが作成されます。

5
kfirba

すべてのUSBデバイス? /etc/udev/rules.d/100-usb.rulesでこの単純な行を使用します

ACTION=="add", RUN+="/bin/mkdir /tmp/folder1"

udevを再起動します

Sudo service udev restart

これは消耗品です

ATTRS{idVendor}=="****", ATTRS{idProduct}=="****", 
5
A.B.
  • これらのATTRS{idVendor}=="****", ATTRS{idProduct}=="****"は何でも対象とします。ルールから削除できます。

  • ただし、その方法は、多くのツリーノードと、USB以外のすべてのデバイスに対してトリガーされます。

    単一のノードとUSBデバイスのみをターゲットとするこのルールを試してください。

    ACTION=="add", SUBSYSTEM=="usb", DRIVER=="usb", RUN+="/usr/local/test.sh"
    
  • どうやってそれを得たか:

    1. udevadm monitor -uを実行します
    2. フラッシュドライブを接続すると、次のように出力されます。

      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)
      
    3. 次を使用して、ヘッドノードの属性を確認します。

      udevadm info -a --path=/sys/devices/pci0000:00/0000:00:14.0/usb1/1-3
      

      出力:

      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"
      
    4. これで、電話、マウスなどのデバイスをさらにチェックすると、1つのデバイスのみをチェックしました。SUBSYSTEM=="usb"DRIVER=="usb"はすべてのUSBデバイスで同じであることがわかります。したがって、ルールの一致に使用できます。

4
user.dz