web-dev-qa-db-fra.com

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

Quelle est la méthode de pointe pour exécuter automatiquement des scripts personnalisés sur un plug-in de périphérique USB dans les distributions Linux actuelles comme 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 ID, etc.).

42
maxschlepzig

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 souhaitez utiliser un chemin d'entrée personnalisé sous /dev.

Courir udevadm info -a -n sdb pour voir quels attributs vous pouvez comparer (attribute=="value"; remplacez sdb par le nom de périphérique attribué automatiquement au disque, correspondant à la nouvelle entrée créée dans /dev lorsque vous le branchez). Notez que vous pouvez utiliser les clauses ATTRS à partir de n'importe quelle strophe one: vous pouvez choisir n'importe quelle strophe, mais les clauses ATTRS doivent toutes provenir de la même strophe, vous pouvez ' t mélanger et assortir. Vous pouvez mélanger des clauses ATTRS avec d'autres types de clauses répertoriées dans une strophe différente.

J'ai examiné /lib/udev/rules.d pour des exemples de règles relatives au disque. Sur un système Ubuntu, un fichier de règles fournit la variable d'environnement ID_FS_UUID_ENC que vous pouvez utiliser dans vos propres fichiers de règles.

J'ai donc mis un fichier de règles personnalisé sous /etc/udev/rules.d/foodevice.rules. Puisqu'il n'est pas préfixé d'un nombre, il est enfin exécuté par udev. Btw, le démon udev a regardé /etc/udev/rules.d pour les modifications telles que vous n'avez pas besoin de le redémarrer lors des modifications de fichier.

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

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

(c'est 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 démarré par udev bloque le démon - il ne devrait donc pas fonctionner pendant longtemps. Je l'ai résolu via at - c'est-à-dire en se détachant du processus faisant le vrai travail:

$ cat /home/juser/path/script.sh
#!/bin/sh
echo ~/path/mountcopystuff.sh | at now
14
maxschlepzig