Ausführen eines Skripts beim Einstecken eines Flash-Laufwerks

Ausführen eines Skripts beim Einstecken eines Flash-Laufwerks

Wie kann ich ein Skript schreiben, das bei einem Ereignis ausgelöst wird?

Wenn ich einen USB-Stick einstecke, mountet Ubuntu ihn und öffnet automatisch Nautilus. Wenn dies mit einem bestimmten Stick passiert, möchte ich eine zweite Registerkarte mit einem bestimmten Ordner öffnen.

Ich glaube nicht, dass dies mit einem Nautilus-Skript möglich ist, aber wie kann ich es mit einem Linux-Skript oder einer Nautilus-Erweiterung machen?

Antwort1

Wenn Sie das folgende Skript im Hintergrund ausführen, sucht es nach gemounteten Volumes. Wenn eines Ihrer definierten Laufwerke gemountet ist, öffnet es automatisch den festgelegten Ordner in Nautilus.

Ein kleines Problem war, dass Nautilus das Öffnen eines Verzeichnisses nicht unterstütztein einem neuen Tabvon der Kommandozeile aus, nur in einem neuen Fenster. Das bedeutet, dass das erste Fenster, das erscheint, wenn Sie ein USB-Laufwerk einstecken, ordnungsgemäß geschlossen werden muss. Das Skript tut wmctrldas, im selben Moment, in dem der ausgewählte Ordner geöffnet wird.

Möglicherweise müssen Sie es zuerst installieren:

sudo apt-get install wmctrl

Das Drehbuch

#!/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)

Wie benutzt man

  1. Kopieren Sie das Skript in eine leere Datei

  2. Legen Sie Ihre Laufwerke und Ordner fest

    Ändern Sie im Kopfbereich des Skripts die Zeile:

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

    wobei jedes Tupel ein Laufwerk (Namen) und den Ordner innerhalb des Laufwerks darstellt, der geöffnet werden muss. Ich habe meine "Test"-Namen als Beispiel belassen.
    Wenn Sie sich über den genauen Namen Ihres Laufwerks nicht sicher sind, führen Sie es aus, lsblkum den Namen anzuzeigen (ohne den vorangehenden Pfad zum Einhängepunkt).

  3. Speichern Sie das Skript

    Speichern Sie das Skript unter open_folder.pyund führen Sie es mit dem folgenden Befehl aus:

    python3 /path/to/open_folder.py
    

Wenn alles wie erwartet funktioniert, fügen Sie es zu Ihren Startanwendungen hinzu

Wie es funktioniert

  • Alle zwei Sekunden führt das Skript den lsblkBefehl aus, um nach allen gemounteten Volumes zu suchen.
  • Wenn ein oder mehrere neu gemountete Volumenamen gefunden werden, wird geprüft, ob der Name in der Liste der Volumes enthalten ist, die Sie auf eine bestimmte Weise öffnen möchten (Öffnen eines Unterverzeichnisses).
  • Das Skript öffnet das Unterverzeichnis des von Ihnen angegebenen Datenträgers und schließt das (Stamm-)Fenster des Laufwerks, das beim Verbinden des Laufwerks automatisch geöffnet wurde.
  • Um das wiederholte Öffnen der Ordner zu verhindern, wird das Volume anschließend zur Liste „Erledigt“ hinzugefügt, bis das Volume ausgehängt wird.

Andere Dateimanager

Ich habe es auf pcmanfm(Lubuntu) und thunar(Xubuntu) getestet und wie erwartet funktioniert es in beiden Fällen einwandfrei.

Wenn Sie es unter Lubuntu oder Xubuntu verwenden möchten, ändern Sie die Zeile:

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

Zu:

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

oder

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

Stellen Sie natürlich sicher, wmctrldass installiert ist

Höchstwahrscheinlich funktioniert es auch mit anderen Dateimanagern.


Verallgemeinerte Version des Skripts

Die obige Version des Skripts ist speziell für eine bestimmte Situation gedacht. Um das Skript für eine breitere Palette von Zwecken verwenden zu können (umbeliebigBefehl, wenn ein bestimmtes Laufwerk angeschlossen wird, um beispielsweise Backups davon zu erstellen) könnte die folgende Version hilfreich sein.

In diesem Fall stellen die Tupel im Kopfabschnitt des Skripts Folgendes dar:

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

siehe die „Test“-Einstellung im Skript unten.

Das Drehbuch

#!/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)

Wie benutzt man

  1. Kopieren Sie das Skript in eine leere Datei

  2. Legen Sie Ihre Laufwerke und Befehle fest

  3. Speichern Sie das Skript

    Speichern Sie das Skript unter drive_run.pyund führen Sie es mit dem folgenden Befehl aus:

    python3 /path/to/drive_run.py
    

Wenn alles wie erwartet funktioniert, fügen Sie es zu Ihren Startanwendungen hinzu

verwandte Informationen