![Ausführen eines Skripts beim Einstecken eines Flash-Laufwerks](https://rvso.com/image/977064/Ausf%C3%BChren%20eines%20Skripts%20beim%20Einstecken%20eines%20Flash-Laufwerks.png)
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 wmctrl
das, 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
Kopieren Sie das Skript in eine leere Datei
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,lsblk
um den Namen anzuzeigen (ohne den vorangehenden Pfad zum Einhängepunkt).Speichern Sie das Skript
Speichern Sie das Skript unter
open_folder.py
und 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
lsblk
Befehl 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, wmctrl
dass 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
Kopieren Sie das Skript in eine leere Datei
Legen Sie Ihre Laufwerke und Befehle fest
Speichern Sie das Skript
Speichern Sie das Skript unter
drive_run.py
und 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