Verwenden von udev-Regeln zum Ausführen eines Skripts beim Einfügen von USB

17

Ich versuche, ein Skript einzurichten, das jedes Mal ausgeführt wird, wenn ich ein USB-Gerät anschließe. Ich habe die Datei /etc/udev/rules.d/90-local.rules erstellt und die folgende Regel hinzugefügt:

ACTION=="add", SUBSYSTEM=="usb", KERNEL=="sd*", SYSFS{model}=="Cruzer*", RUN+="sh /home/jesse/Documents/Scripts/cruzer.sh"

Das Problem ist, dass beim Anschließen des Laufwerks nichts passiert. Das Skript ist für Debugging-Zwecke so manipuliert, dass es eine Benachrichtigung mit notify-send sendet, die installiert ist und vom Terminal aus einwandfrei funktioniert.

Der Pfad zum Skript ist korrekt, da ich den genauen Befehl ohne Probleme im Terminal ausgeführt habe.

JTeK
quelle
Läuft Ihr Virenschutzprogramm? Dies ist ein Verhalten, das eine Aktion von einer beliebigen Anzahl von AV-Programmen auslösen würde. Obwohl ich eine Warnung erwarte, wird diese möglicherweise nur in den Protokollen angezeigt, wenn Sie Benachrichtigungen deaktiviert haben. Ich würde empfehlen, das Internet zu deaktivieren, dann Ihr AV-Programm, um es erneut zu versuchen.
Zenbike
Ausführen von Ubuntu 11.04 ohne installiertes AV.
4.
@zenbike: Warum sollte das Hinzufügen von benutzerdefinierten udev-Regeln ein Antivirenprogramm auslösen?
Grawity
Das Starten eines Skripts beim Einfügen eines Geräts kann dazu führen, dass in einem AV-Gerät falsche Positive zum Scannen von Wechseldatenträgern auftreten. Ich weiß es nicht. Dass es mir mit einem werksseitig installierten Skript auf einem Thumbdrive und Avira AV passiert ist, weiß ich.
Zenbike

Antworten:

6

Ich hatte das gleiche problem Das hat bei mir funktioniert:

Versuchen Sie, Ihr Skript zu kopieren /usr/local/binund das Verzeichnis in Ihrer .rulesDatei zu ändern .

Ich weiß auch nicht, was SYSFS ist, aber ich würde es vorziehen, die ATTR-Eigenschaften zu verwenden.

Die folgende Zeile ist der Inhalt meiner .rulesDatei:

ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd[a-z]1", ATTRS{vendor}=="SanDisk ", RUN+="/usr/local/bin/backup.sh"
plk
quelle
der ATTRS{vendor}=="SanDisk "teil heißt das, dass nur Sandisknoch erkannt wird?
Blade19899
7

notify-send erfordert Zugriff auf Ihren DBus-Sitzungsbus, den er aus zwei Gründen nicht haben kann:

  • Keine Informationen zur Sitzung. Wenn Ihr Skript von udev gestartet wird, weiß es nichts darüber, wo Sie angemeldet sind oder ob Sie überhaupt angemeldet sind. Multi-Seat mit X11 ist immer noch schwierig, aber der Benutzerwechsel funktioniert sowohl für X11- als auch für Konsolensitzungen. Viele Leute benutzen auch SSH, VNC und NX über das Netzwerk.

    ( DISPLAY=:0Würde die Hälfte der Zeit arbeiten, aber das ist bestenfalls noch zu raten .)

  • Von der DBus-Richtlinie abgelehnt. Selbst wenn Ihr Skript Ihre X11-Sitzung irgendwie findet, kann es keine Benachrichtigungen senden, da das Skript rootanstelle Ihres Benutzerkontos ausgeführt wird.

Grawity
quelle
2
for LINE in $(find /proc/ -maxdepth 2 -name environ -exec grep -z "^DBUS_SESSION_BUS_ADDRESS" {} \; | sort -uz | tr '\0' '\n'); do eval $LINE ... done;habe den Trick für mich mit benachrichtigen-senden
mlt
1

Sie können stattdessen versuchen, das Gerät nach Hersteller- und Produkt-IDs abzugleichen. Die folgende benutzerdefinierte Regel funktioniert für mich:

ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="0763", ATTR{idProduct}=="019b", RUN+="/usr/bin/aconnect 20 128"

Sie können idVendor und idProduct in der lsusb-Ausgabe oder in dmesg sehen, nachdem Sie das Gerät angeschlossen haben.

Aleh
quelle
Ich habe es versucht und es hat auch nicht funktioniert ... (ATTR {idProduct} == "5530") ... wird der Anbieter auch benötigt? Das würde ich nicht glauben ...
JTeK
In diesem Fall liegt das Problem möglicherweise am Skript selbst. Beispielsweise kann es von der Umgebungsvariablen $ PATH abhängen. Versuchen Sie zum Testen, es wie export PATH = '' auszuführen. /home/jesse/Documents/Scripts/cruzer.sh
Aleh
1

Alehs Antwort weiterverfolgen: Wenn Sie auch removeEreignisse überwachen möchten , müssen Sie nach einer Umgebungsvariablen mit dem Namen suchen ID_SERIAL. Es enthält Hersteller- und Produkt-ID, die durch einen Unterstrich getrennt sind:

ACTION=="add|remove", SUBSYSTEM=="usb", ENV{ID_SERIAL}=="0763_019b" RUN+="/usr/bin/aconnect 20 128"

Die Regel ist jetzt auch kürzer.

krlmlr
quelle
0

Möglicherweise müssen Sie sleepinnerhalb des Skripts ein hinzufügen , um dem USB-Gerät die Möglichkeit zu geben, sich zu "beruhigen"? Zum Beispiel USB 3G-Modems, Moduswechsel, um ein / dev / ttyUSB vom Kernel zum Laufen zu bringen.

t0mm13b
quelle
0

Versuchen Sie, SUBSYSTEM = "usb" durch SUBSYSTEMS = "usb" zu ersetzen.

Arnaud
quelle
Nein, SUBSYSTEM=="usb"ist gut so.
krlmlr