web-dev-qa-db-fra.com

Utilisation de règles UDev pour exécuter un script sur l'insertion USB

J'essaie de configurer un script pour fonctionner à chaque fois que je branche un périphérique USB. J'ai créé le fichier / etc/udev/rules.d/90-local.rules et ajouté la règle suivante:

ACTION=="add", SUBSYSTEM=="usb", KERNEL=="sd*", SYSFS{model}=="Cruzer*", RUN+="sh /home/jesse/Documents/Scripts/cruzer.sh"

Le problème est que lorsque le lecteur est connecté, rien ne se passe. Le script, à des fins de débogage, est truqué pour envoyer une notification avec notify-Send, qui est installée et fonctionne bien du terminal.

Le chemin du script est correct, car j'ai exécuté cette commande exacte dans le terminal sans aucun problème.

17
JTeK

notify-send nécessite un accès à votre bus de session DBUS, qu'il ne peut pas avoir pour deux raisons:

  • Aucune information sur la session. Lors de la démarche de Udev, votre script sait rien sur l'endroit où vous êtes connecté ou si vous êtes connecté du tout. Multi-siège avec X11 est toujours délicat, mais la commutation utilisateur fonctionne pour les sessions X11 et Console. Beaucoup de gens utilisent également SSH, VNC et NX sur le réseau.

    (DISPLAY=:0 travaillerait la moitié du temps, mais c'est toujours deviner au mieux.)

  • Refusé par la politique de DBU. Même si votre script trouve en quelque sorte votre session X11, il ne pourra pas envoyer de notifications en raison du script étant exécuté en tant que root au lieu de votre compte d'utilisateur.

7
user1686

Vous pouvez essayer de faire correspondre le périphérique par fournisseur et ID du produit. La règle personnalisée suivante fonctionne pour moi:

ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="0763", ATTR{idProduct}=="019b", RUN+="/usr/bin/aconnect 20 128"

Vous pouvez voir IDVendor et IDProduct dans la sortie LSUSB ou DMESG après la fixation du périphérique.

1
Aleh

Suivi de la réponse de Aleh: Si vous souhaitez également surveiller les événements remove, vous devez rechercher une variable d'environnement nommée ID_SERIAL. Il contient le fournisseur et l'ID de produit séparé par le soulignement:

ACTION=="add|remove", SUBSYSTEM=="usb", ENV{ID_SERIAL}=="0763_019b" RUN+="/usr/bin/aconnect 20 128"

La règle est maintenant plus courte aussi.

1
krlmlr

Essayez de remplacer le sous-système = "USB" avec des sous-systèmes = "USB"

0
arnaud