Comment exécuter un script shell lorsqu'un nouveau périphérique de stockage USB est détecté?

17

Je veux un script qui vide le journal et commence à s'y connecter dès qu'un stockage de masse USB est branché (avec le fichier 'OKdump' dessus). Et si quelque chose d'anormal (comme une erreur qui est visuellement présente) est détecté, je veux pour prendre une capture d'écran et l'enregistrer sur le même lecteur.

Amith KK
la source

Réponses:

13

Utilisez Udev. Udev est un démon de gestionnaire de périphériques. Il est notamment chargé de nommer vos appareils. Vous pouvez définir des règles udev en plaçant des fichiers avec une certaine syntaxe dans le répertoire rules. Les règles peuvent faire beaucoup de choses - en particulier, elles peuvent exécuter des scripts, lorsqu'un certain périphérique est connecté.

Comment résoudre votre problème:

Vous devez d'abord recueillir des informations sur votre appareil. Disons que vous l'avez connecté, et sachez qu'il va sous le nom /dev/sdb1. Si c'est le cas, exécutez:

udevadm info -a -p $(udevadm info -q path -n /dev/sdb1)

La commande affichera des informations sur votre appareil. C'est assez long. Vous devez trouver quelque chose qui identifie l'appareil de manière unique. Cela pourrait être une série commeATTRS{serial}=="UA04FLGC" ou une combinaison d'autres attributs tels que ATTRS{idVendor}et ATTRS{idProduct}. La plupart des noms sont plus ou moins explicites. Choisissez-en une ou une combinaison de quelques-unes qui semblent raisonnables - si elles ne fonctionnent pas, essayez autre chose.

Une fois que vous avez trouvé un identifiant unique, créez un fichier /etc/udev/rules.dqui commence par deux chiffres et se termine par .rules. Les deux chiffres spécifient l'ordre de traitement de ces fichiers .rules -70-usb-log-custom.rules devrait être un bon choix pour vous. La syntaxe de ce fichier de règles peut être très complexe. Si vous êtes intéressé, google udev. Sinon, ouvrez simplement le fichier nouvellement créé et modifiez-le pour qu'il ressemble à ceci:

# /etc/udev/rules.d/70-usb-log-custom.rules

KERNEL=="sd?1", ATTRS{serial}=="UA04FLGC", ACTION=="add", SYMLINK+="cusb1", RUN+="/home/confus/bin/usb-encrypt.sh add %k"
ENV{ID_FS_USAGE}=="crypto", ACTION=="remove", RUN+="/home/confus/bin/usb-encrypt.sh remove %k"
SUBSYSTEM=="usb", SYSFS{idVendor}=="1781", SYSFS{idProduct}=="0c9f", GROUP="users", MODE="0666"

Il s'agit d'un fichier udev réel que j'utilise. Il contient trois règles. Chaque ligne est une règle qui lui est propre. La première ligne exécute un script pour créer un périphérique déchiffré chaque fois qu'un disque chiffré est connecté. La deuxième ligne invoque le même script avec différentes options dans le cas où le périphérique déchiffré est supprimé. La troisième ligne définit les autorisations pour un autre périphérique associé.

Vous n'aurez probablement besoin que de la première ligne. Supprimez le reste et insérez la bonne série (ou la combinaison de paramètres que vous avez choisis pour identifier votre appareil).

Explication de mon dossier:

KERNEL=="sd?1"dit que le périphérique que nous recherchons dans cette règle est nommé dans le sens de /dev/sda1, /dev/sdc1ou quelque chose comme ça. Le point d'interrogation est un caractère générique pour n'importe quelle lettre. ATTRS{serial}=="UA04FLGC"est l'identifiant unique ici. Pour l'autre appareil dont je parlais (troisième ligne), je n'utilise pas le numéro de série mais une combinaison de SYSFS{idVendor}=="1781"et SYSFS{idProduct}=="0c9f"pour l'identifier.

ACTION=="add"indique à la règle qu'elle ne doit agir que lorsque le périphérique est ajouté; pas quand il est retiré.

SYMLINK+="cusb1"crée un lien symbolique vers le disque afin que l'on le trouve sous /dev/cusb1.

RUN+="/home/confus/bin/usb-encrypt.sh add %k" exécute le script et lui passe «add» et «% k» (le nom du périphérique).

Je ne donnerai pas plus de détails, car il existe d'excellents tutoriels sur les règles udev. Ce que vous lisez ici devrait cependant suffire à être regardé.

embrouiller
la source
Excellente réponse mais je veux maintenant un script qui fasse la journalisation
Amith KK
4
Ensuite, VOUS devrez l'écrire ou être plus précis sur ce que vous voulez exactement. Par exemple, je ne vois pas ce qu'une capture d'écran vous dirait. Également «vide le journal système» où aller? «Tout ce qui est anormal» est également un terme assez large. Nous ne sommes pas votre armée personnelle - si vous savez une chose ou deux sur le script bash, vous avez maintenant tous les outils dont vous avez besoin pour écrire le script vous-même.
con-f-use
: D désolé @ con-f-use
Amith KK