web-dev-qa-db-fra.com

Exécution d'un script lors de l'insertion d'un lecteur flash

Comment puis-je écrire un script qui déclenche un événement?

Lorsque j'insère un lecteur flash USB, Ubuntu le monte et ouvre automatiquement Nautilus. Lorsque cela se produit avec un lecteur flash spécifique, j'aimerais ouvrir un deuxième onglet avec un dossier déterminé.

Je ne pense pas que cela puisse être fait avec un script Nautilus, mais comment puis-je le faire avec un script Linux ou une extension Nautilus?

6
YoArgentino

Si vous exécutez le script ci-dessous en arrière-plan, il recherche les volumes montés. Si l’un des disques que vous avez définis est monté, il ouvre automatiquement le dossier défini dans Nautilus.

Un problème mineur était que nautilus ne supportait pas l'ouverture d'un répertoire dans un nouvel onglet à partir de la ligne de commande, uniquement dans une nouvelle fenêtre. Cela signifie que la fenêtre initiale, qui apparaît si vous insérez un lecteur USB, doit être fermée avec élégance. Le script utilise wmctrl pour le faire, au même moment où le dossier choisi sera ouvert.

Vous devrez peut-être d'abord l'installer:

Sudo apt-get install wmctrl

Le scénario

#!/usr/bin/env python3

import subprocess
import time

#--
drivename_folders = [("My Passport", "docs"), ("7827-2F8C", "sanel")]
#--

def get_mountedlist():
    return [item[item.find("/"):] for item in subprocess.check_output(
            ["/bin/bash", "-c", "lsblk"]).decode("utf-8").split("\n") if "/" in item]

done = []

while True:
    mounted = get_mountedlist()
    new_paths = [dev for dev in mounted if not dev in done]
    valid = sum([[(drive, drive+"/"+item[1], item[0]) for drive in new_paths \
                  if item[0] in drive] for item in drivename_folders], [])

    for item in valid:
        open_window = "nautilus  "+"'"+item[1]+"'"
        close_window = "wmctrl -c  "+"'"+item[2]+"'"
        subprocess.Popen(["/bin/bash", "-c", open_window])
        time.sleep(1)
        subprocess.Popen(["/bin/bash", "-c", close_window])

    done = mounted
    time.sleep(2)

Comment utiliser

  1. Copiez le script dans un fichier vide

  2. Définissez vos lecteurs et dossiers

    Dans la section head du script, modifiez la ligne:

    drivename_folders = [("My Passport", "docs"), ("7827-2F8C", "MyFolder")]
    

    où chaque Tuple représente un lecteur (nom) et le dossier à l'intérieur du lecteur à ouvrir. J'ai laissé mes noms "test" à titre d'exemple.
    Si vous n'êtes pas sûr du nom exact de votre lecteur, exécutez lsblk pour voir le nom (sans le chemin précédent du point de montage).

  3. Sauvegarder le script

    Enregistrez le script sous open_folder.py et exécutez-le à l'aide de la commande suivante:

    python3 /path/to/open_folder.py
    

Si tout fonctionne comme prévu, ajoutez-le à vos applications de démarrage.

Comment ça fonctionne

  • Toutes les deux secondes, le script exécute la commande lsblk pour rechercher tous les volumes montés.
  • S'il trouve un ou plusieurs noms de volume nouvellement montés, il vérifie s'il figure dans la liste des volumes que vous avez définis pour une ouverture spécifique (ouverture d'un sous-répertoire).
  • Le script ouvre le sous-répertoire du volume que vous avez défini et ferme la fenêtre (racine) du lecteur qui s’est ouverte automatiquement lors de la connexion du lecteur.
  • Pour empêcher l'ouverture répétée des dossiers, le volume est ensuite ajouté à la liste "terminé", jusqu'à ce que le volume soit démonté.

Autres gestionnaires de fichiers

Je l'ai testé sur pcmanfm (Lubuntu) et thunar (Xubuntu) et, comme prévu, dans les deux cas, tout se passe bien.

Si vous souhaitez l’utiliser sur Lubuntu ou Xubuntu, modifiez la ligne:

open_window = "nautilus  "+"'"+item[1]+"'"

à:

open_window = "thunar "+"'"+item[1]+"'"
(for Xubuntu)

ou

open_window = "pcmanfm "+"'"+item[1]+"'"
(for Lubuntu, also disable in pcmanfm's preferences: Media > "Show available options for removable media")

Bien sûr, assurez-vous que wmctrl est installé

Très probablement, cela fonctionnera également sur d'autres gestionnaires de fichiers.


Version généralisée du script

La version du script ci-dessus est spécifiquement destinée à une situation. Pour pouvoir utiliser le script dans un plus grand nombre de buts (exécuter la commande toute quand un lecteur spécifique est connecté, en effectuant des sauvegardes par exemple), la version ci-dessous pourrait être utile.

Dans ce cas, dans la section head du script, les n-uplets représentent:

 drivename_folders = [(<drivename_a>, <command_a>), (<drivename_b>, <command_b>)]

voir le réglage "test" dans le script ci-dessous.

Le scénario

#!/usr/bin/env python3

import subprocess
import time

#--
drivename_command = [("My Passport", "gnome-terminal"), ("F806-0C50", "gedit")]
#--

def get_mountedlist():
    return [item[item.find("/"):] for item in subprocess.check_output(
            ["/bin/bash", "-c", "lsblk"]).decode("utf-8").split("\n") if "/" in item]

done = []

while True:
    mounted = get_mountedlist()
    newly_mounted = [dev for dev in mounted if not dev in done]
    valid = sum([[(drive, item[1]) for drive in newly_mounted \
                  if item[0] in drive] for item in drivename_command], [])
    for item in valid:
        subprocess.Popen(["/bin/bash", "-c", item[1]])
    done = mounted
    time.sleep(2)

Comment utiliser

  1. Copiez le script dans un fichier vide

  2. Définissez vos lecteurs et commandes

  3. Sauvegarder le script

    Enregistrez le script sous drive_run.py et exécutez-le à l'aide de la commande suivante:

    python3 /path/to/drive_run.py
    

Si tout fonctionne comme prévu, ajoutez-le à vos applications de démarrage.

6
Jacob Vlijm