web-dev-qa-db-fra.com

Règles udev ciblant chaque périphérique USB

J'essaie d'exécuter un script chaque fois qu'une clé USB est connectée. Ce que j'ai actuellement est un script de démonstration dans /usr/local/test.sh:

#!/bin/bash

touch /home/kfir/test.txt

J'ai également un fichier de règles qui tente de faire correspondre n'importe quelle clé USB dans /etc/udev/rules.d/100-usb.rules:

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

Le problème est que le fichier test.txt n'est jamais créé. J'ai aussi l'erreur suivante:

error message

Je ne sais pas quoi faire maintenant. Ce que je veux réaliser est assez simple: lorsqu’un périphérique de stockage USB est branché, exécutez un script simple (créez un fichier test.txt dans ce cas).

P.S. le fichier test.sh fonctionne bien. Lorsque je l'ai exécuté manuellement, il crée le fichier test.txt.

5
kfirba

Chaque périphérique USB? Utilisez cette simple ligne dans /etc/udev/rules.d/100-usb.rules

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

et redémarrez udev

Sudo service udev restart

C'est consommable

ATTRS{idVendor}=="****", ATTRS{idProduct}=="****", 
5
A.B.
  • Ces ATTRS{idVendor}=="****", ATTRS{idProduct}=="****" ciblent n'importe quoi, vous pouvez les supprimer de la règle.

  • Cependant, cela se déclenchera pour de nombreux nœuds d'arborescence et pour tous les périphériques, même les périphériques non USB.

    Essayez cette règle qui cible un seul nœud et uniquement des périphériques USB:

    ACTION=="add", SUBSYSTEM=="usb", DRIVER=="usb", RUN+="/usr/local/test.sh"
    
  • Comment j'ai eu ça:

    1. Exécutez udevadm monitor -u
    2. Branchez une clé USB, la sortie est la même que celle-ci:

      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. Prenez le nœud principal pour vérifier ses attributs en utilisant:

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

      Sortie:

      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. Maintenant, nous n’avons vérifié qu’un seul périphérique, si nous vérifions plus de périphériques: téléphone, souris ... nous découvrirons que SUBSYSTEM=="usb" et DRIVER=="usb" sont identiques pour tous les périphériques USB. Ils peuvent donc être utilisés pour la correspondance de règles.

4
user.dz