Utilisation des règles udev pour exécuter un script lors de l'insertion USB


17

J'essaie de configurer un script à exécuter 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é et fonctionne correctement à partir du terminal.

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


Votre antivirus fonctionne-t-il? Il s'agit d'un comportement qui déclencherait l'action de n'importe quel nombre de programmes AV. Bien que je m'attende à un avertissement, si vous avez désactivé les notifications, vous ne pouvez pas le voir, sauf dans les journaux. Je recommanderais de désactiver Internet, puis votre programme AV, de le réessayer.
zenbike

Exécuter Ubuntu 11.04 sans AV installé.
JTeK

@zenbike: Pourquoi l'ajout de règles udev personnalisées déclencherait-il un programme antivirus?
user1686

Le démarrage de tout script lors de l'insertion d'un périphérique peut provoquer des faux positifs dans un ensemble AV pour analyser les périphériques amovibles. Mais je ne sais pas. Que cela m'est arrivé avec un script installé en usine sur une clé USB et Avira AV, je le sais.
zenbike

Réponses:


6

J'ai eu le même problème. Cela a fonctionné pour moi:

Essayez de copier votre script dans /usr/local/binet modifiez le répertoire de votre .rulesfichier.

De plus, je ne sais pas ce qu'est SYSFS, mais je préférerais utiliser les propriétés ATTR.

La ligne suivante est le contenu de mon .rulesfichier:

ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd[a-z]1", ATTRS{vendor}=="SanDisk ", RUN+="/usr/local/bin/backup.sh"

la ATTRS{vendor}=="SanDisk "partie cela signifie-t-il que seul Sandisksera détecté?
blade19899

7

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

  • Aucune information sur la session. Lorsqu'il est démarré par udev, votre script ne sait pas où vous êtes connecté ou si vous êtes connecté du tout. Multi-siège avec X11 est toujours délicat, mais le changement d'utilisateur fonctionne pour les sessions X11 et console. De nombreuses personnes utilisent également SSH, VNC et NX sur le réseau.

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

  • Refusé par la politique DBus. Même si votre script trouve en quelque sorte votre session X11, il ne pourra pas envoyer de notifications en raison de l'exécution du script au rootlieu de votre compte d'utilisateur.


2
for LINE in $(find /proc/ -maxdepth 2 -name environ -exec grep -z "^DBUS_SESSION_BUS_ADDRESS" {} \; | sort -uz | tr '\0' '\n'); do eval $LINE ... done;a fait l'affaire pour moi avec notify-send
mlt

1

Vous pouvez essayer de faire correspondre le périphérique par ID de fournisseur et de produit à la place. 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 avoir connecté le périphérique.


J'ai essayé cela, et cela n'a pas fonctionné non plus ... (ATTR {idProduct} == "5530") ... le vendeur est-il également requis? Je ne pense pas ...
JTeK

Dans ce cas, le problème peut être lié au script lui-même. Par exemple, cela peut dépendre de la variable env $ PATH. Pour un test, essayez de l'exécuter comme export PATH = ''; /home/jesse/Documents/Scripts/cruzer.sh
Aleh

1

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

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

La règle est désormais également plus courte.


0

Peut-être, vous devrez peut-être ajouter un sleepdans le script, pour donner au périphérique USB une chance de "s'installer"? Par exemple, les modems usb 3g, le changement de mode pour obtenir un / dev / ttyUSB pour être lancé et exécuté par le noyau.


0

Essayez de remplacer SUBSYSTEM = "usb" par SUBSYSTEMS = "usb"


Non, SUBSYSTEM=="usb"c'est très bien.
krlmlr
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.