He estado tratando de usar udev
para 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.sh
este 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.txt
se crea ningún archivo.
Mi lsusb
en la tarjeta:
Bus 001 Device 015: ID 0cf3:9271 Atheros Communications, Inc. AR9271 802.11n
Ejecutar udevadm monitor –env
esto 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=info
Logré 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 0
có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?
fuente
/bin/echo
se ejecutó correctamente como sugiere su registro. El resultado de su comando estest > /test.txt
como 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 dejaudev
ejecutartouch /test.txt
en contraste con lo que ha hecho, verá un nuevo archivo en su raíz.Respuestas:
Tuve un problema similar hace un tiempo y la solución fue cambiar la
RUN+=
parte aRUN+="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.fuente
!
no funciona.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: SMi consejo sería para establecer la prioridad de la tala
udev
deerr
queinfo
conSi desea ver aún más información, configúrela
debug
. Ahora puede encontrar información muy detallada de lo queudev
hizo/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.
fuente