Comment exécuter des scripts personnalisés sur un plug-in de périphérique USB?

41

Quelle est la méthode la plus avancée pour exécuter automatiquement des scripts personnalisés sur un plug-in de périphérique USB dans les distributions Linux actuelles telles que Debian / CentOS / Fedora?

Par exemple, si vous souhaitez monter / copier automatiquement certains fichiers / démonter un périphérique de stockage de masse USB en fonction de son UUID (ou de son identifiant de périphérique, etc.).

maxschlepzig
la source

Réponses:

27

Mettez une ligne comme celle-ci dans un fichier dans /etc/udev/rules.d:

KERNEL=="sd*", ATTRS{vendor}=="Yoyodyne", ATTRS{model}=="XYZ42", ATTRS{serial}=="123465789", RUN+="/pathto/script"

Ajoutez une clause comme NAME="subdir/mydisk%n"si vous voulez utiliser un chemin d’entrée personnalisé sous /dev.

Exécuter udevadm info -a -n sdbpour voir quels attributs vous pouvez comparer ( attribute=="value"; remplacez sdbpar le nom de périphérique attribué automatiquement au disque, correspondant à la nouvelle entrée créée dans /devlorsque vous le branchez). Notez que vous pouvez utiliser les ATTRSclauses de toute une strophe: vous pouvez choisir une strophe, mais les ATTRSclauses doivent tous provenir de la même strophe, vous ne pouvez pas mélanger et assortir. Vous pouvez mélanger des ATTRSclauses avec d'autres types de clauses répertoriées dans une strophe différente.

Gilles, arrête de faire le mal
la source
1
Cette réponse est-elle toujours valable? Sous aucun prétexte, je ne peux exécuter le script (et toucher un fichier). Si vous pouvez fournir l'exemple le plus élémentaire qui exécute un script lorsque quelque chose est branché, ce serait formidable et nous pouvons travailler à partir de là.
Redsandro
@Redsandro J'ai des variantes de cette règle dans ma configuration udev et elles fonctionnent. Avez-vous branché et débranché l'appareil udevadm trigger? Votre système utilise-t-il udev? Si vous souhaitez exécuter un script lorsque quelque chose est branché, supprimez toutes les conditions (les clauses avec ==) (peut-être que la syntaxe nécessite une condition, je ne suis pas sûr; sinon, utilisez KERNEL=="*").
Gilles 'SO- arrête d'être méchant'
J'ai aussi essayé, mais comme cela fonctionne pour vous, il me manque une étape. J'ai déplacé cette question ici , ainsi je peux écrire un exemple de code.
Redsandro
Peut-être liée, je pense qu'il y a une limite de temps sur la durée d'exécution du script. Je crois que c'est très court (comme 1 seconde ou quelque chose). Si cela prend plus de temps que ça, alors udev le tuera. Vous pouvez contourner ce problème en utilisant l'arrière-plan du script avec quelque chose comme at. Voir "exécuter des programmes externes" sur reactivated.net/writing_udev_rules.html
cheshirekow
Pour ajouter à cela, par souci d'exhaustivité, le fichier doit avoir le suffixe .ruleset les fichiers du répertoire sont lus dans un ordre lexical (la convention utilise un préfixe numérique pour les ordonner), et ils peuvent être en dessous /etc/, /usr/libou /run. Pour plus, RTFM .
starfry
14

J'ai examiné /lib/udev/rules.ddes exemples de règles relatives aux disques. Sur un système Ubuntu, un fichier de règles fournit la variable d’environnement ID_FS_UUID_ENCque vous pouvez utiliser dans vos propres fichiers de règles.

Ainsi, je mets un fichier de règles personnalisées sous /etc/udev/rules.d/foodevice.rules. Comme il n’est pas préfixé par un nombre, il est enfin exécuté par udev. Au fait, le démon udev a surveillé les /etc/udev/rules.dmodifications, de sorte qu'il n'est pas nécessaire de le redémarrer pour modifier les fichiers.

Le contenu de /etc/udev/rules.d/foodevice.rulesest:

ACTION=="add", KERNEL=="sd*[!0-9]", ENV{ID_FS_UUID_ENC}=="FFFF-AAAF",
  RUN+="/usr/bin/sudo -u juser /home/juser/path/script.sh"

(il s'agit d'une règle - vous devez supprimer la nouvelle ligne après la clause ENV car udev n'a pas de mécanisme de continuation de ligne)

Un programme lancé par udev bloque le démon - il ne devrait donc pas s’exécuter longtemps. Je l'ai résolu via at- c'est-à-dire en détachant du processus le travail réel:

$ cat /home/juser/path/script.sh
#!/bin/sh
echo ~/path/mountcopystuff.sh | at now
maxschlepzig
la source
1
Vous devrez peut-être recharger les règles udev avec udevadm control --reload-rules, en fonction de votre distribution.
user44038
1
Au lieu de at nowje suggère batch.
Réintégrer Monica - M. Schröder
Que faire quand vous n'avez ni atni batch? Je suis dans un environnement embarqué avec busybox .
natenho
@natenho, vous pouvez utiliser ~/path/mountcopystuff.sh &- atetc. présente l'avantage de recevoir des notifications par courrier électronique en cas de problème - mais sur un système embarqué, cela n'a probablement pas beaucoup d'intérêt.
maxschlepzig