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.

JTeK
la source
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"
plk
la source
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.

user1686
la source
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.

Aleh
la source
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.

krlmlr
la source
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.

t0mm13b
la source
0

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

arnaud
la source
Non, SUBSYSTEM=="usb"c'est très bien.
krlmlr