Wie kann ich benutzerdefinierte Skripte auf einem USB-Gerät ausführen?


41

Was ist die neueste Methode, um benutzerdefinierte Skripte unter aktuellen Linux-Distributionen wie Debian / CentOS / Fedora automatisch über das USB-Geräte-Plug-In auszuführen?

Zum Beispiel, wenn Sie ein USB-Massenspeichergerät basierend auf seiner UUID (oder Geräte-ID usw.) automatisch laden / kopieren / laden möchten.

Antworten:


27

Fügen Sie eine Zeile wie diese in eine Datei ein /etc/udev/rules.d:

KERNEL=="sd*", ATTRS{vendor}=="Yoyodyne", ATTRS{model}=="XYZ42", ATTRS{serial}=="123465789", RUN+="/pathto/script"

Fügen Sie eine Klausel hinzu, z. B. NAME="subdir/mydisk%n"wenn Sie einen benutzerdefinierten Eingabepfad unter verwenden möchten /dev.

Führen udevadm info -a -n sdbSie den Befehl aus, um festzustellen, mit welchen Attributen Sie übereinstimmen können ( attribute=="value"ersetzen Sie ihn sdbdurch den Gerätenamen, der der Festplatte automatisch zugewiesen wird und dem neuen Eintrag entspricht, der /devbeim Einstecken erstellt wurde). Beachten Sie, dass Sie ATTRSKlauseln aus einer beliebigen Zeilengruppe verwenden können: Sie können eine beliebige Zeilengruppe auswählen, aber die ATTRSKlauseln müssen alle aus derselben Zeilengruppe stammen. Sie können sie nicht mischen und zuordnen. Sie können ATTRSKlauseln mit anderen Klauseltypen mischen , die in einer anderen Zeilengruppe aufgeführt sind.


1
Ist diese Antwort noch gültig? Unter keinen Umständen kann ich das Skript ausführen lassen (und eine Datei berühren). Wenn Sie das einfachste Beispiel angeben können, das ein Skript ausführt, wenn etwas eingesteckt ist, wäre das großartig, und wir können von dort aus arbeiten.
Redsandro

@Redsandro Ich habe Variationen dieser Regel in meiner udev-Konfiguration und sie funktionieren. Haben Sie das Gerät aus- und wieder eingesteckt oder sind Sie gestartet udevadm trigger? Verwendet Ihr System udev? Wenn Sie ein Skript ausgeführt werden soll , wenn nichts angeschlossen ist, entfernen Sie alle Bedingungen (die Klauseln mit ==) (vielleicht die Syntax erfordert eine Bedingung, ich bin mir nicht sicher, ob es funktioniert, Verwendung KERNEL=="*").
Gilles 'SO- hör auf böse zu sein'

Das habe ich auch versucht, aber da es bei Ihnen funktioniert, muss mir ein Schritt fehlen. Ich habe diese Frage hierher verschoben , damit ich Beispielcode schreiben kann.
Redsandro

Vielleicht im Zusammenhang, ich denke, es gibt eine zeitliche Begrenzung, wie lange das Skript ausgeführt werden kann. Ich glaube es ist sehr kurz (wie 1 Sekunde oder so). Wenn es länger dauert, wird udev es töten. Sie können dies umgehen, indem Sie das Skript mit so etwas wie einem Hintergrundbild versehen at. Siehe "Ausführen externer Programme" auf reactivated.net/writing_udev_rules.html
cheshirekow

Nur um dies zuzugeben , der Vollständigkeit halber, um die Datei Bedürfnisse haben das Suffix .rulesund die Dateien in dem Verzeichnis , in einer lexikalischen Reihenfolge gelesen werden (Konvention verwendet numerischen Präfix , um sie), und sie können unter sein /etc/, /usr/liboder /run. Für mehr RTFM .
Starfry

14

Ich habe nach /lib/udev/rules.dBeispielen für festplattenbezogene Regeln gesucht . Auf einem Ubuntu-System enthält eine Regeldatei die Umgebungsvariable, ID_FS_UUID_ENCdie Sie in eigenen Regeldateien verwenden können.

Also habe ich eine benutzerdefinierte Regeldatei darunter gelegt /etc/udev/rules.d/foodevice.rules. Da ihm keine Nummer vorangestellt ist, wird er zuletzt von udev ausgeführt. Übrigens hat der udev-Daemon /etc/udev/rules.dnach Änderungen gesucht, sodass Sie ihn bei Dateiänderungen nicht neu starten müssen.

Der Inhalt von /etc/udev/rules.d/foodevice.rulesist:

ACTION=="add", KERNEL=="sd*[!0-9]", ENV{ID_FS_UUID_ENC}=="FFFF-AAAF",
  RUN+="/usr/bin/sudo -u juser /home/juser/path/script.sh"

(Dies ist eine Regel - Sie müssen den Zeilenumbruch nach der ENV-Klausel entfernen, da udev keinen Zeilenfortsetzungsmechanismus hat.)

Ein von udev gestartetes Programm blockiert den Daemon - er sollte also nicht lange laufen. Ich habe es gelöst, atindem ich mich von dem Prozess gelöst habe , der die eigentliche Arbeit erledigt hat:

$ cat /home/juser/path/script.sh
#!/bin/sh
echo ~/path/mountcopystuff.sh | at now

1
udevadm control --reload-rulesAbhängig von Ihrer Distribution müssen Sie möglicherweise die udev-Regeln mithilfe von neu laden .
user44038

1
Stattdessen at nowschlage ich vor batch.
Wiedereinsetzung von Monica - M. Schröder

Was tun, wenn Sie weder haben atnoch batch? Ich bin in einer eingebetteten Umgebung mit Busybox .
Natenho

@natenho können Sie verwenden ~/path/mountcopystuff.sh &- atusw. hat den Vorteil, dass Sie E-Mail-Benachrichtigungen erhalten, falls etwas schief geht - aber auf einem eingebetteten System ist dies wahrscheinlich nicht von großem Interesse.
Maxschlepzig
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.