Skript automatisch ausführen, wenn die WLAN-Karte eingesteckt ist (udev)

9

Ich habe versucht udev, ein Debian-System dazu zu bringen, ein Bash-Skript auszuführen, wenn eine drahtlose Karte verbunden ist.

Bisher habe ich diese Datei erstellt /etc/udev/rules.d/wifi-detect.rules:

ACTION=="add", ATTRS{idVendor}=="0cf3", ATTRS{idProduct}=="9271", RUN+="/root/test.sh"

Und im Moment versuche ich, test.shmit diesen Inhalten zu arbeiten:

#!/bin/bash
/bin/echo "test!" > /test.txt

Aber aus irgendeinem Grund scheint nichts zu passieren, wenn ich die WLAN-Karte verbinde. Es wird keine test.txtDatei erstellt.

Mein lsusbauf der Karte:

Bus 001 Device 015: ID 0cf3:9271 Atheros Communications, Inc. AR9271 802.11n

Laufen udevadm monitor –envdas ist , was passiert , wenn ich die Karte anschließen:

KERNEL[1017.642278] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3 (usb)
KERNEL[1017.644676] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0 (usb)
KERNEL[1017.645035] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/firmware/1-1.3 (firmware)
KERNEL[1017.708056] remove   /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/firmware/1-1.3 (firmware)
UDEV  [1017.714772] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3 (usb)
UDEV  [1017.733002] remove   /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/firmware/1-1.3 (firmware)
UDEV  [1017.772669] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/firmware/1-1.3 (firmware)
UDEV  [1017.798707] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0 (usb)
KERNEL[1018.456804] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/ieee80211/phy8 (ieee80211)
KERNEL[1018.465994] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/net/wlan0 (net)
KERNEL[1018.479878] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/leds/ath9k_htc-phy8 (leds)
KERNEL[1018.483074] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/usb_device/usbdev1.20 (usb_device)
UDEV  [1018.600456] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/leds/ath9k_htc-phy8 (leds)
UDEV  [1018.604376] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/ieee80211/phy8 (ieee80211)
UDEV  [1018.626243] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/usb_device/usbdev1.20 (usb_device)
KERNEL[1018.659318] move     /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/net/wlan1 (net)
UDEV  [1018.758843] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/net/wlan1 (net)
UDEV  [1018.932207] move     /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/net/wlan1 (net)

Ich habe viele Beispiele ausprobiert, aber ich kann es nicht zum Laufen bringen. Ich hoffe jemand kann mir dabei helfen;) Danke!


BEARBEITEN:

Um die Sache zu vereinfachen, habe ich meine Regel geändert in:

ACTION=="add", ATTRS{idVendor}=="0cf3", ATTRS{idProduct}=="9271", RUN+="/bin/echo 'test' > /test.txt"

Ich habe es geschafft, udevadm control --log-priority=infowie von @ user1146332 vorgeschlagen festzulegen, und ich habe dieses interessante Protokoll erhalten:

Sep  9 16:27:53 iklive-rpi1 udevd[1537]: RUN '/bin/echo 'test' > /test.txt' /etc/udev/rules.d/wifi-detect.rules:1
Sep  9 16:27:53 iklive-rpi1 udevd[1544]: starting 'firmware.agent'
Sep  9 16:27:53 iklive-rpi1 udevd[126]: seq 663 queued, 'remove' 'firmware'
Sep  9 16:27:53 iklive-rpi1 udevd[126]: seq 663 forked new worker [1547]
Sep  9 16:27:53 iklive-rpi1 udevd[1537]: 'firmware.agent' [1544] exit with return code 0
Sep  9 16:27:53 iklive-rpi1 udevd[1548]: starting '/bin/echo 'test' > /test.txt'
Sep  9 16:27:53 iklive-rpi1 udevd[1547]: seq 663 running
Sep  9 16:27:53 iklive-rpi1 udevd[1547]: no db file to read /run/udev/data/+firmware:1-1.3.4: No such file or directory
Sep  9 16:27:53 iklive-rpi1 udevd[1547]: passed -1 bytes to netlink monitor 0x1af5ee0
Sep  9 16:27:53 iklive-rpi1 udevd[126]: seq 663 done with 0
Sep  9 16:27:53 iklive-rpi1 udevd[1547]: seq 663 processed with 0
Sep  9 16:27:53 iklive-rpi1 udevd[1537]: '/bin/echo 'test' > /test.txt'(out) 'test > /test.txt'
Sep  9 16:27:53 iklive-rpi1 udevd[1537]: '/bin/echo 'test' > /test.txt' [1548] exit with return code 0

Also ... Ist das nicht der return code 0Exit-Code für einen erfolgreichen Abschluss? Wenn ja, warum bekomme ich keine Datei auf dem System?


EDIT 2:

Ich habe es geschafft, dies mit dem Tipp von @htor zum Laufen zu bringen. Meine aktuelle Regel:

ACTION=="add", ATTRS{idVendor}=="0cf3", ATTRS{idProduct}=="9271", RUN+="/bin/sh -c '/bin/echo test >> /test.txt'"

Aber aus irgendeinem Grund wird der Befehl achtmal ausgeführt. Gibt es eine Möglichkeit, dies zu vermeiden? Ich denke, das passiert, weil die Treiber der drahtlosen Karte beim Laden praktisch abmontiert und montiert werden müssen. Tipps?

TCB13
quelle
1
im Zusammenhang mit EDIT: Ich bin sicher, dass das /bin/echoerfolgreich ausgeführt wurde, wie Ihr Protokoll vorschlägt. Die Ausgabe Ihres Befehls erfolgt test > /test.txtwie in Ihrem Protokoll angegeben. Der Grund dafür ist, dass der Charakter >in Ihrem Kontext überhaupt keine besondere Bedeutung hat. Es ist nur das dritte Befehlszeilenargument, an das Sie übergeben haben echo. Sie erhalten, was Sie wollen, wenn Sie Ihre Shell die angegebene Zeile interpretieren lassen /bin/echo 'test' > /test.txt. Wie bei Ihrer zweiten Bearbeitung. Wenn Sie beispielsweise im Gegensatz zu dem, was Sie getan haben , udevausführen lassen , wird touch /test.txteine neue Datei in Ihrem Stammverzeichnis angezeigt.
user1146332

Antworten:

4

Ich hatte vor einiger Zeit ein ähnliches Problem und die Lösung bestand darin, das RUN+=Teil auf zu ändern RUN+="sh -c '/root/test.sh'". Jetzt weiß ich nicht, ob Sie das in diesem Fall brauchen, da die Regel ein Skript aufruft, keinen Befehl.

Eine weitere Beobachtung: Versuchen Sie, das !aus der "test!"Zeichenfolge zu entfernen, oder ersetzen Sie die doppelten Anführungszeichen durch einfache Anführungszeichen. Der Knall !macht wahrscheinlich Probleme wegen seiner besonderen Bedeutung in der Schale und die doppelten Anführungszeichen bewahren diese Bedeutung.

Gemeinschaft
quelle
Mit oder ohne !funktioniert es nicht.
TCB13
RUN+="/bin/sh -c '/bin/echo test >> /test.txt'"funktioniert, aber aus irgendeinem Grund wurde "Test" 8 Mal in die Datei geschrieben. Es scheint, als würde der Befehl mehrmals ausgeführt: S
TCB13
3

Mein Rat wäre, die Protokollierungspriorität von udevvon errbis infomit festzulegen

 udevadm control --log-priority=info

Wenn Sie noch mehr Informationen sehen möchten, stellen Sie diese ein debug. Jetzt finden Sie sehr detaillierte Informationen darüber, was udevin /var/log/daemon.log(zumindest auf einem Debian-bezogenen System) geschehen ist. Im Allgemeinen hilft das sehr, Fehler zu verfolgen.

Dies ist nur eine Ergänzung zu der Antwort von htor, die wahrscheinlich Ihr Problem löst.

user1146332
quelle