web-dev-qa-db-fra.com

Comment exécuter un script lorsqu'un lecteur flash spécifique est monté?

Existe-t-il un moyen d'exécuter un script lorsqu'un périphérique USB particulier est monté?

Je conserve mes vidéos sur une clé USB distincte et souhaite exécuter un script permettant de monter le dossier vidéo du périphérique USB sur celui du dossier personnel.

46
user9428

Il y a une solution beaucoup plus agréable avec systemd maintenant. Vous créez un service qui dépend et qui est recherché par votre média, par exemple: /etc/systemd/system/your.service

[Unit]
Description=My flashdrive script trigger
Requires=media-YourMediaLabel.mount
After=media-YourMediaLabel.mount

[Service]
ExecStart=/home/you/bin/triggerScript.sh

[Install]
WantedBy=media-YourMediaLabel.mount

Ensuite, vous devez démarrer/activer le service:
Sudo systemctl start your.service
Sudo systemctl enable your.service

Après le montage, systemd déclenche votre script de déclenchement. L'avantage par rapport à la règle udev est que le script se déclenche vraiment après le montage, pas après l'ajout d'un périphérique système.

Cas d'utilisation : J'ai une partition cryptée que je veux sauvegarder automatiquement. Après avoir ajouté l'appareil, je dois taper le mot de passe. Si j'ai raccordé le script de sauvegarde à udev, le script tente de s'exécuter au moment où je tape le mot de passe, ce qui échouera.

Ressource: Scripting with udev

Remarque: Vous pouvez trouver votre unité de périphérique avec: Sudo systemctl list-units -t mount

31
sumid

Commencez par rechercher votre appareil dans lsusb. Notez l'ID (par exemple 0a81:0101)

Créez un nouveau fichier de règles udev dans /etc/udev/rules.d/ via sudoedit /etc/udev/rules.d/100-mount-videos.ruleset insérez une nouvelle règle comme celle-ci:

ACTION=="add", ATTRS{idVendor}=="0a81", ATTRS{idProduct}=="0101", RUN+="/home/your_username/bin/mount_videos.sh"

Notez comment j'ai utilisé l'ID de lsusb.

Ensuite, il vous suffit d'écrire le script pour effectuer le travail. Une simple commande de montage devrait fonctionner. Vous aurez peut-être besoin d'une commande sleep 5 pour attendre que le système de fichiers s'initialise (si vous laissez gnome faire le montage principal - mais vous êtes libre de le monter en premier et vous n'aurez peut-être pas besoin de sommeil).

Addition d'Allan: Des scripts longs peuvent bloquer "tous les événements suivants pour cet appareil ou un appareil dépendant". La page de manuel My Mint indique en outre "Les tâches de longue durée doivent être immédiatement détachées du processus d'événement lui-même." Aucune astuce n'est donnée pour savoir où acquérir l'habileté pour le faire.

Réponse de Oli: Enveloppez-le comme suit: https://askubuntu.com/a/106359/449

29
Oli

Une autre façon d'obtenir les valeurs pour ATTRS {idVendor} et ATTRS {idProduct} (testé dans Ubuntu 12.04) est la suivante:

  1. Trouvez où votre usb est monté:

    $ mount | grep /dev/sd*
    

    cela montre quelque chose comme ce qui suit:

    /dev/sdb on /media/SOMEDIR type vfat ...
    
  2. Utilisez udevadm pour obtenir les informations sur ce périphérique:

    udevadm info -q all -n /dev/sdb | grep -E -i -w '.*VENDOR_ID.*|.*MODEL_ID.*'
    

    la sortie devrait être quelque chose comme:

    E: ID_MODEL_ID=001a
    E: ID_VENDOR_ID=002b
    
  3. Maintenant, utilisez l'ID de modèle pour ATTRS {idProduct} et l'ID de fournisseur pour ATTRS {idVendor}

    ACTION=="add", ATTRS{idVendor}=="002b", ATTRS{idProduct}=="001a" ...
    
8
emont01

Si vous ne souhaitez pas interférer avec le contrôle de votre gestionnaire de fichiers (nautilus, konquerer, gnome, etc.) sur le montage et le démontage de votre appareil, je vous suggère de ne pas suivre la route udev.

Au lieu de cela, utilisez disks-glue si votre système utilise des udisks (presque tous le font).

Après l’installation, créez simplement un fichier de configuration ~/.udisks-glue.conf dans votre répertoire personnel.

L'exemple suivant met à jour les données GPS-Assist sur mon appareil photo chaque fois que je connecte la carte SD.

filter BT16EXTREME {
  optical = false
  partition_table = false
  usage = filesystem
  label = BT16EXTREME
}
match BT16EXTREME {
  post_mount_command = "/home/bernhard/update-gps-assist-data.pl %mount_point"
}

Ensuite, assurez-vous que udisks-glue démarre lorsque vous démarrez ou que vous vous connectez. C'est à dire. via les applications de démarrage de gnome

1
xro

Dans Nautilus, sous Edition> Préférences> Multimédia, vous pouvez choisir "autre action" et que "commande costum". pour différents types de médias à exécuter. À ce moment-là, le lecteur USB est déjà monté, mais je suppose que vous pouvez toujours le lier (avec une commande costum) au dossier dans lequel vous souhaitez que le lecteur apparaisse. Je ne saurais dire si c'est plus facile ou meilleur que d'utiliser udev.

1
bacon

La réponse de @ sumid a un problème. Vous devriez pas démarrer le service. Vous devez juste l'activer.

fichier: /etc/systemd/system/your.service

[Unit]
Description=My flashdrive script trigger
Requires=media-YourMediaLabel.mount
After=media-YourMediaLabel.mount

[Service]
ExecStart=/any_path_even_inside_the_mount_point/script.sh

[Install]
WantedBy=media-YourMediaLabel.mount

Activez ensuite le service:

Sudo systemctl enable your.service

C'est tout.

Note: Vous pouvez trouver votre étiquette médiane avec: Sudo systemctl list-units -t mount

Note2: Si le service échoue d'une manière ou d'une autre (par exemple, le script n'est pas exécutable), votre point de montage deviendra <old_mount_point_name>1 lors de la prochaine installation du périphérique USB. Pour résoudre ce problème, il vous suffit d'exécuter Sudo systemctl reset-failed

0
sgon00
0
user10333