Exécuter automatiquement un script après avoir branché ou débranché un périphérique USB

22

Que puis-je faire pour exécuter automatiquement un script après avoir monté / plugin ou démonté / débranché un périphérique USB?

Radu Rădeanu
la source
2
@XxxXxx: n'est pas une option tant que Cuttlefish n'a pas de version
finale
2
doublon possible: askubuntu.com/questions/25071/…
Glutanimate
@Glutanimate: cette question concerne un lecteur flash USB spécifique, mais j'ai posé des questions sur un périphérique USB, en général
Radu Rădeanu
@Glutanimate: disons que les réponses à cette question sont utiles, de toute façon ne répond pas à la façon d'exécuter automatiquement un script après avoir débranché un périphérique USB.
Radu Rădeanu
1
"disons que les réponses à cette question sont utiles, de toute façon ne répond pas à la façon d'exécuter automatiquement un script après avoir débranché un périphérique USB" Je suppose que si vous changez "ACTION = 'add'" en "ACTION = 'supprimer' ", ce serait un bon point de départ.
blujay

Réponses:

17

Merci à MinimusHeximus et aux contributeurs respectifs au fil qu'il a mentionné dans son commentaire à ma question similaire, je pense que je peux maintenant vous offrir la réponse suivante.

Vous aurez besoin de 5 (cinq) fichiers pour un tel périphérique USB comme suit, en remplissant simplement les valeurs respectives <fortheseparts>:

/etc/udev/rules.d/00-usb-<yourdevice>.rules

ACTION=="add", ATTRS{idVendor}=="<yourvendorid>", ATTRS{idProduct}=="<yourproductid>", ENV{XAUTHORITY}="/home/<user>/.Xauthority", ENV{DISPLAY}=":0", OWNER="<user>", RUN+="/usr/local/bin/usb-<yourdevice>-in_udev"    
ACTION=="remove", ATTRS{idVendor}=="<yourvendorid>", ATTRS{idProduct}=="<yourproductid>", ENV{XAUTHORITY}="/home/<user>/.Xauthority", ENV{DISPLAY}=":0", OWNER="<user>", RUN+="/usr/local/bin/usb-<yourdevice>-out_udev"

/usr/local/bin/usb-<yourdevice>-in_udev

#!/bin/bash
/usr/local/bin/usb-<yourdevice>-in &

/usr/local/bin/usb-<yourdevice>-in

#!/bin/bash
sleep 1
<yourbashscriptcode>

/usr/local/bin/usb-<yourdevice>-out_udev

#!/bin/bash
/usr/local/bin/usb-<yourdevice>-out &

/usr/local/bin/usb-<yourdevice>-out

#!/bin/bash
sleep 1
<yourbashscriptcode>

Remarques:

  1. Vous pouvez capturer les valeurs <yourvendorid>et <yourproductid>en entrant la commande lsusbdans le Terminal - lorsque votre périphérique USB est branché - qui liste tous vos périphériques USB actuellement disponibles, comme Bus 003 Device 002: ID 8087:07da Intel Corp., où 8087 est le VendorID et 07da est le ProductID .
  2. Et <yourdevice>peut être n'importe quel nom arbitraire que vous pouvez choisir pour votre périphérique USB, par exemple, j'ai choisi d'utiliser le nom générique " clavier " lors de la création de tels fichiers pour mon clavier USB qui nécessitait d'appliquer une disposition de clavier différente chaque fois qu'il est branché.
  3. Dans certains scénarios, il peut ne pas être nécessaire d'utiliser la ACTION=="remove"ligne dans le fichier de règles udev, et donc les 2 (deux) " out" fichiers associés , lorsque vous n'avez rien à faire (par exemple, annuler une modification effectuée lorsque le périphérique est branché) après avoir débranché l'appareil.
Sadi
la source
Cela semble faux de mon point de vue novice. Ces clauses ne doivent-elles pas être sur la même ligne?
nafg
1
Cela fonctionne: ACTION == "add", ATTRS {idVendor} == "...", ATTRS {idProduct} == "...", ENV {XAUTHORITY} = "/ home / <user> /.Xauthority" , ENV {DISPLAY} = ": 0", RUN + = "<script>"
nafg
@nafg: de mon point de vue novice, cela ne devrait faire aucune différence si vous mettez tous ceux-ci sur une seule ligne (en utilisant une virgule comme séparateur) dans le fichier de règles udev, mais je vois que vous avez ajouté des paramètres XAUTHORITY et DISPLAY aux règles udev, qui pourrait fonctionner pour vous ou quelqu'un d'autre, auquel cas je me demande s'ils ne sont plus nécessaires dans les deux fichiers de script ci-dessous.
Sadi
1
oui c'est le point, vous n'avez plus besoin du script intermédiaire (sauf peut-être pour mettre le script réel en arrière-plan) puisque udev vous permet de définir l'environnement. De plus, d'après ce que je comprends des documents udev, chaque ligne est une règle indépendante, les lignes d'un fichier ne sont pas combinées.
nafg
@nafg: Merci pour votre précieuse contribution. J'ai déplacé ces environnements vers la règle udev et cela a aussi fonctionné pour moi. De plus, j'ai déplacé les scripts vers / usr / local / bin lorsque j'ai commencé à rencontrer des problèmes après avoir déplacé mon dossier / home sur une partition distincte (probablement parce qu'il n'était pas monté plus tôt). Il semble que l'utilisation de sauts de ligne dans les règles udev ne pose aucun problème au moins dans mon système (Ubuntu 13.04 64 bits) et j'ai préféré cela pour la lisibilité.
Sadi