Esegui script automaticamente quando è inserita la scheda Wifi (udev)


9

Ho provato a usare udevun sistema Debian per eseguire uno script bash quando è connessa una scheda wireless.

Finora ho creato questo file /etc/udev/rules.d/wifi-detect.rules:

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

E per ora, sto cercando di far funzionare test.shquesto contenuto:

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

Ma per qualche motivo, non sembra accadere nulla quando collego la scheda wireless, non test.txtviene creato alcun file.

Il mio lsusbsulla carta:

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

L'esecuzione di udevadm monitor –envquesto è ciò che accade quando collego la scheda:

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)

Ho provato molti esempi in giro ma non riesco a farlo funzionare. Spero che qualcuno mi possa aiutare con questo;) Grazie!


MODIFICARE:

Per semplificare la cosa, ho cambiato la mia regola in:

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

Sono riuscito a impostare udevadm control --log-priority=infocome suggerito da @ user1146332 e ho ottenuto questo registro interessante:

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

Quindi ... Non è il return code 0codice di uscita per il completamento con successo? Se è così, perché non ottengo alcun file sul sistema?


MODIFICA 2:

Sono riuscito a farlo funzionare usando il suggerimento di @htor. La mia regola attuale:

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

Ma per qualche motivo il comando viene eseguito come 8 volte, c'è un modo per evitarlo? Penso che stia succedendo perché quando i driver della scheda wireless vengono caricati devono praticamente smontare e montare la scheda. Suggerimenti?


1
relativi a EDIT: sono sicuro che sia /bin/echostato eseguito correttamente come suggerisce il tuo registro. L'output del comando è test > /test.txtcome indicato nel registro. La ragione di ciò è che il personaggio >non ha alcun significato speciale nel tuo contesto. È solo il terzo argomento della riga di comando a cui sei passato echo. Ottieni quello che vuoi se lasci che la tua shell interpreti la linea data /bin/echo 'test' > /test.txt. Come hai fatto nel tuo secondo EDIT. Ad esempio, se lasci che venga udeveseguito touch /test.txtin contrasto con quello che hai fatto, vedresti un nuovo file nella tua radice.
user1146332

Risposte:


4

Ho avuto un problema simile qualche tempo fa e la soluzione era cambiare la RUN+=parte in RUN+="sh -c '/root/test.sh'". Ora, non so se in questo caso ne hai bisogno in quanto la regola chiama uno script, non un comando.

Un'altra osservazione: prova a rimuovere il !dalla "test!"stringa o sostituisci le doppie virgolette con virgolette singole. Il botto !probabilmente crea problemi a causa del suo significato speciale nella shell e le doppie virgolette conservano quel significato.


Con o senza il !non funziona.
TCB13,

RUN+="/bin/sh -c '/bin/echo test >> /test.txt'"funziona, ma per qualche motivo ho ottenuto "test" scritto 8 volte nel file. Sembra che il comando venga eseguito più volte: S
TCB13

3

Il mio consiglio sarebbe di impostare la priorità di registrazione di udevda erra infocon

 udevadm control --log-priority=info

Se desideri vedere ancora più informazioni, impostalo su debug. Ora puoi trovare informazioni molto dettagliate su ciò che ha udevfatto /var/log/daemon.log(almeno su un sistema relativo a Debian). In genere ciò aiuta molto a inseguire errori.

Questo è solo un complemento alla risposta di Htor che probabilmente risolverà il tuo problema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.