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:
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
.
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}=="****",
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:
udevadm monitor -u
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)
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"
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.