Script de ejecución automática cuando la tarjeta Wifi está conectada (udev)

9

He estado tratando de usar udevpara hacer que un sistema Debian ejecute un script bash cuando se conecta una tarjeta inalámbrica.

Hasta ahora creé este archivo /etc/udev/rules.d/wifi-detect.rules:

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

Y por ahora, estoy tratando de hacer que test.sheste contenido funcione:

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

Pero por alguna razón, nada parece suceder cuando conecto la tarjeta inalámbrica, no test.txtse crea ningún archivo.

Mi lsusben la tarjeta:

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

Ejecutar udevadm monitor –envesto es lo que sucede cuando conecto la tarjeta:

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)

He probado muchos ejemplos pero no puedo hacer que funcione. Espero que alguien pueda ayudarme con esto;) ¡Gracias!


EDITAR:

Para simplificar, cambié mi regla a:

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

udevadm control --log-priority=infoLogré establecer como @ user1146332 sugirió y obtuve este registro interesante:

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

Entonces ... ¿No es el return code 0código de salida para completar con éxito? Si es así, ¿por qué no obtengo ningún archivo en el sistema?


EDITAR 2:

Logré hacer que esto funcionara usando la sugerencia de @htor. Mi regla actual:

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

Pero por alguna razón, el comando se ejecuta como 8 veces, ¿hay alguna manera de evitar esto? Creo que está sucediendo porque cuando se cargan los controladores de la tarjeta inalámbrica, necesitan desmontar y montar la tarjeta prácticamente. ¿Consejos?

TCB13
fuente
1
relacionado con EDITAR: estoy seguro de que /bin/echose ejecutó correctamente como sugiere su registro. El resultado de su comando es test > /test.txtcomo lo indica su registro. La razón de esto es que el personaje >no tiene ningún significado especial en su contexto. Es solo el tercer argumento de línea de comando al que pasó echo. Obtiene lo que desea si deja que su shell interprete la línea dada /bin/echo 'test' > /test.txt. Como lo hiciste en tu segunda edición. Por ejemplo, si deja udevejecutar touch /test.txten contraste con lo que ha hecho, verá un nuevo archivo en su raíz.
user1146332

Respuestas:

4

Tuve un problema similar hace un tiempo y la solución fue cambiar la RUN+=parte a RUN+="sh -c '/root/test.sh'". Ahora, no sé si necesita eso en este caso, ya que la regla llama a un script, no a un comando.

Otra observación: intente eliminar el !de la "test!"cadena o reemplace las comillas dobles con comillas simples. La explosión !probablemente esté causando problemas debido a su significado especial en el shell y las comillas dobles conservan ese significado.

Comunidad
fuente
Con o sin el !no funciona.
TCB13
RUN+="/bin/sh -c '/bin/echo test >> /test.txt'"funciona, pero por alguna razón obtuve una "prueba" escrita 8 veces en el archivo. Parece que el comando se está ejecutando varias veces: S
TCB13
3

Mi consejo sería para establecer la prioridad de la tala udevde errque infocon

 udevadm control --log-priority=info

Si desea ver aún más información, configúrela debug. Ahora puede encontrar información muy detallada de lo que udevhizo /var/log/daemon.log(al menos en un sistema relacionado con Debian). En general, eso ayuda mucho persiguiendo errores.

Esto es solo un complemento de la respuesta de htor que probablemente resuelva su problema.

usuario1146332
fuente