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

46

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 qui monte le dossier vidéo du périphérique USB sur celui du dossier personnel.

Braiam
la source

Réponses:

31

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: Script avec udev

Remarque: vous pouvez trouver votre appareil avec:systemctl list-units -t mount

sumid
la source
J'espère que avril 2016 arrive bientôt. Systemd sera activé dans le prochain LTS Ubuntu. Autant que je sache, la solution proposée ci-dessus nécessite Ubuntu 15.04 ou une version plus récente.
guettli
Oh, je pensais que systemd est déjà à Ubuntu. Je suis actuellement en train de
lancer
@sumid Si je veux le mettre sous ~ / .config / systemd, ça va marcher?
Khurshid Alam
4
Génial! Testé dans Jessie Debian. N'oubliez pas d'activer votre service systemctl enable your.service. Le fichier de script doit être exécutable.
Corni
1
Pour moi, cela échoue. Lorsque j'essaie de démarrer le service, il se plaint de "Unité media-bb.mount introuvable". J'ai appelé le FS "bb" de ma clé USB (FAT32) pour m'assurer qu'il ne contenait aucun caractère étrange et qu'il n'était pas trop long ou quelque chose du genre. J'ai essayé le Requires=, After=et les WantedBy=lignes avec media-bb.mountet media-BB.mountparce que Nautilus me montre le volume en tant que "BB", pas "bb". Même message d'erreur, sauf pour la capitalisation. Qu'est-ce qui ne va pas? Dois-je en quelque sorte créer ce media-<something>.mountservice?
UTF-8
29

Commencez par trouver 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 ajoutez 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 sleep 5commande 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 à partir d'Allan: Les scripts longs peuvent bloquer "tous les événements ultérieurs pour ce périphérique ou un périphérique dépendant". La page de manuel My Mint indique également "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: Envelopper comme ça: https://askubuntu.com/a/106359/449

Oli
la source
4
Je pourrais suggérer de préfixer la commande "RUN" avec "su votre_utilisateur -c" afin que le script ne s'exécute pas avec les privilèges root.
Kees Cook
3
@Kees Comme l'objectif est de plus en plus important, garder les privilèges root pourrait être une bonne idée. Peut-être qu'au lieu de garder le script chez l'utilisateur, vous le gardez /root/ou à un endroit où seul root peut le modifier.
Oli
2
Cela ne répond pas à la question. La question demande comment exécuter un script lorsqu'un lecteur USB est monté . Cette réponse explique comment exécuter un script qui monte un lecteur USB lorsqu’il est inséré . La différence compte pour moi parce que j'ai un tel script (pour un appareil photo numérique); sans script, le lecteur peut ou peut être monté lors de l'insertion (en fonction des paramètres utilisateur) et c'est uniquement lorsque le lecteur est monté que je veux faire quelque chose (copier les images). Ainsi, mon script (qui s'exécute lorsque le lecteur est ajouté) s'exécute souvent au mauvais moment.
Reinier Post le
c'est une manière incroyablement spécifique (fragile) de réaliser. @sumid answer plus applicable aux distributions modernes utilisant systemd
MrMesees
8

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" ...
    
emont01
la source
1

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.

Bacon
la source
la commande porte-t-elle un costume? ou un costume?
erjoalgo
1

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.

Utilisez plutôt udisks-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.confdans votre répertoire personnel, comme ceci.

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

xro
la source
1
Ne supporte pas udev2 :-(
sumid
0

La réponse de @ sumid a un problème. Vous ne 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.

Remarque: vous pouvez trouver votre étiquette médiane avec:sudo systemctl list-units -t mount

Remarque 2: 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 la <old_mount_point_name>1prochaine fois que vous monterez le périphérique USB. Pour résoudre ce problème, il vous suffit d'exécutersudo systemctl reset-failed

sgon00
la source