Automatyczne uruchamianie skryptu po podłączeniu karty Wi-Fi (udev)

9

Próbowałem użyć, udevaby system Debian uruchomił skrypt bash po podłączeniu karty bezprzewodowej.

Do tej pory utworzyłem ten plik /etc/udev/rules.d/wifi-detect.rules:

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

Na razie staram się, aby test.shta zawartość działała:

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

Ale z jakiegoś powodu nic nie dzieje się po podłączeniu karty sieci bezprzewodowej, żaden test.txtplik nie jest tworzony.

Moje lsusbna karcie:

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

Uruchomienie udevadm monitor –envtego dzieje się po podłączeniu karty:

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)

Próbowałem wielu przykładów, ale nie mogę sprawić, żeby działało. Mam nadzieję, że ktoś może mi w tym pomóc;) Dziękuję!


EDYTOWAĆ:

Aby uprościć sprawę, zmieniłem zasadę na:

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

Udało mi się ustawić udevadm control --log-priority=infozgodnie z sugestią @ user1146332 i otrzymałem ten interesujący dziennik:

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

Więc ... Czy return code 0kod wyjścia nie jest zakończony powodzeniem? Jeśli tak, dlaczego nie otrzymuję żadnego pliku w systemie?


EDYCJA 2:

Udało mi się to uruchomić za pomocą wskazówki @htor. Moja obecna zasada:

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

Ale z jakiegoś powodu polecenie jest wykonywane 8 razy, czy istnieje sposób, aby tego uniknąć? Wydaje mi się, że tak się dzieje, ponieważ kiedy sterowniki karty bezprzewodowej są ładowane, muszą praktycznie odmontować i zamontować kartę. Porady

TCB13
źródło
1
związane z EDYCJĄ: Jestem pewien, że /bin/echozostał wykonany pomyślnie, jak sugeruje Twój dziennik. Dane wyjściowe polecenia są test > /test.txtzgodne ze stanem dziennika. Powodem tego jest to, że postać >nie ma żadnego specjalnego znaczenia w twoim kontekście. To tylko trzeci argument wiersza poleceń, który przekazałeś echo. Dostajesz to, co chcesz, jeśli pozwalasz swojej powłoce interpretować podaną linię /bin/echo 'test' > /test.txt. Tak jak podczas drugiego EDYCJI. Na przykład, jeśli pozwolisz na udevwykonanie touch /test.txtw przeciwieństwie do tego, co zrobiłeś, zobaczysz nowy plik w katalogu głównym.
user1146332

Odpowiedzi:

4

Miałem podobny problem jakiś czas temu i rozwiązaniem była zmiana RUN+=części na RUN+="sh -c '/root/test.sh'". Teraz nie wiem, czy potrzebujesz tego w tym przypadku, ponieważ reguła wywołuje skrypt, a nie polecenie.

Kolejna obserwacja: spróbuj usunąć ciąg !z "test!"ciągu lub zastąp podwójne cudzysłowy pojedynczymi cudzysłowami. Wybuch !prawdopodobnie sprawia kłopoty ze względu na swoje specjalne znaczenie w powłoce, a podwójne cudzysłowy zachowują to znaczenie.

Społeczność
źródło
Z lub bez !nie działa.
TCB13,
RUN+="/bin/sh -c '/bin/echo test >> /test.txt'"działa, ale z jakiegoś powodu dostałem „test” zapisany 8 razy w pliku. Wygląda na to, że polecenie jest wykonywane wielokrotnie: S
TCB13
3

Radzę ustawić priorytet rejestrowania udevod errdo infoz

 udevadm control --log-priority=info

Jeśli chcesz zobaczyć jeszcze więcej informacji, ustaw je na debug. Teraz możesz znaleźć bardzo szczegółowe informacje o tym, co udevsię stało /var/log/daemon.log(przynajmniej w systemie związanym z Debianem). Ogólnie pomaga to w bardzo częstych błędach.

To tylko uzupełnienie odpowiedzi htor, która prawdopodobnie rozwiązuje twój problem.

użytkownik1146332
źródło