Idée : avoir une clé USB qui permet de lancer des actions quand on l'insère, sans avoir à s'authentifier.

Utilisation envisagée : réparations rapides, sur machines en état de booter sous linux.

  • l'administrateur enregistre la suite de commandes de réparations dans un script de la clé USB
  • il passe sur chaque machine démarrée sous Linux pour insérer sa clé, ce qui exécute le script.

Testé sur Debian "squeeze" par une belle après-midi d'octobre 2011.

Solution technique

Se base sur "udev", qui gère dynamiquement les évènements sous Linux.

Insèrer une clé USB déclenche une cascade d'évènements : chargement de pilotes USB, du pilote SCSI, SCSI_DISK, etc. qui finit par le montage de la clé USB.

Ce comportement est défini par les fichiers de configuration de /etc/udev/rules.d qui décrivent ce qu'il faut faire en fonction des actions au niveau de chacun des sous-systèmes.

En pratique, pour observer les évènements :

  1. lancer la commande udevadm monitor --udev dans un terminal
  2. insérer / enlever des dispositifs USB
  3. remarquer les actions (add, remove) et les sous-systèmes, indiqués entre parenthèses (scsi, usb, etc.)

Les clés USB ont un numéro de série individuel, qui assure c'est bien la clé spéciale de l'administrateur

Ici on décrit

  1. comment trouver le numéro de série de la clé
  2. comment lancer un script quand cette clé est insérée

TROUVER LE NUMERO DE SÉRIE DE LA CLé

  • insérer la clé ;
  • normalement elle s'auto-monte, par exemple sur /dev/sdb (vérifier avec mount)
  • faire udevadm info --name=/dev/sdb --attribute-walk pour afficher les infos liées aux différents devices.
  • l'un d'eux possède des attributs "product" et "serial"
ATTRS{product}=="Flash Drive"
ATTRS{serial}=="............."

notez le numéro de série (points ci-dessus).


LANCER UN SCRIPT QUAND LA CLÉ EST INSÉRÉE / RETIRÉE

Dans /etc/udev/rules.d, ajouter un fichier 91-cle-usb.rules qui contiendra les lignes

SUBSYSTEM=="block", ACTION=="add", ATTRS{serial}=="........", SYMLINK="reparator", RUN="/usr/local/bin/cle-usb.sh add"
SUBSYSTEM=="block", ACTION=="remove", ATTRS{serial}=="........", RUN="/usr/local/bin/cle-usb.sh remove"

qui lanceront le script /usr/local/bin/cle-usb.sh avec le paramêtre add ou remove quand le sous-système "scsi_disk" signale que la clé est ajoutée / enlevée. Plusieurs sous-systèmes (usb, scsi ...) signalent le même évènement "add" (ou "remove") (voir "udevadm monitoe" plus haut).

"scsi_disk" est celui de plus haut niveau. Le paramètre "SYMLINK" indique que le périphérique sera montable dans /dev/reparator (crée un lien symbolique vers /dev/sdb1)

La règle est activée pour les periphs blocs /dev/sdb et /dev/sdb1, si il y a deux partitions sur /dev/sdb. Apparemment, c'est la seconde (sdb1) qui est retenue.

Doc : man 7 udev


UN SCRIPT POUR ESSAYER

#!/bin/bash
( 
  echo -n evenement $1 
  date
) >> /tmp/journal.txt

On pourrait y ajouter la séquence

  mkdir /tmp/a
  mount /dev/reparator /tmp/a
  /tmp/a/monscript
  unmount /tmp/a

Ou encore, pour éviter de monopoliser la clé

case $1 in
add) 
	# monter la clé
	mkdir /tmp/a
   	mount /dev/reparator /tmp/a || exit 
	# copier le script dans /tmp
	...
	# demonter
	# faire un signal sonore
       # lancer le script
      ...
	;;
remove)
	#
       # ...
	;;
 esac

---

Note : Pour que la règle "91" soit prise en compte (sans rebooter)

udevadm control --reload-rules