Executar automaticamente o script quando o cartão Wifi estiver conectado (udev)

9

Eu tenho tentado usar udevpara fazer um sistema Debian executar um script bash quando uma placa wireless está conectada.

Até agora eu criei este arquivo /etc/udev/rules.d/wifi-detect.rules:

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

E, por enquanto, estou tentando fazer test.shcom que este conteúdo funcione:

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

Mas, por alguma razão, nada parece acontecer quando eu conecto a placa sem fio, nenhum test.txtarquivo é criado.

Meu lsusbno cartão:

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

Executando udevadm monitor –envisso é o que acontece quando eu conecto o cartão:

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)

Eu tentei muitos exemplos, mas não consigo fazer isso funcionar. Espero que alguém possa me ajudar com este;) Obrigado!


EDITAR:

Para simplificar, mudei minha regra para:

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

Consegui definir udevadm control --log-priority=infocomo @ user1146332 sugerido e recebi este 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

Então ... Não é o return code 0código de saída para a conclusão com êxito? Se sim, por que não consigo nenhum arquivo no sistema?


EDIT 2:

Consegui fazer isso funcionar usando a dica do @htor. Minha regra atual:

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

Mas, por alguma razão, o comando é executado 8 vezes, existe uma maneira de evitar isso? Acho que está acontecendo porque, quando os drivers da placa sem fio estão sendo carregados, eles precisam praticamente desmontar e montar a placa. Dicas?

TCB13
fonte
11
relacionado à edição: tenho certeza de que o /bin/echofoi executado com êxito, como sugere o seu log. A saída do seu comando é test > /test.txtcomo o seu log indica. A razão para isso é que o personagem >não tem nenhum significado especial no seu contexto. É apenas o terceiro argumento da linha de comando para o qual você passou echo. Você consegue o que deseja se deixar seu shell interpretar a linha especificada /bin/echo 'test' > /test.txt. Como você fez na sua segunda edição. Por exemplo, se você permitir udevexecutar touch /test.txtem contraste com o que você fez, verá um novo arquivo em sua raiz.
user1146332

Respostas:

4

Eu tive um problema semelhante há um tempo atrás e a solução era mudar a RUN+=peça para RUN+="sh -c '/root/test.sh'". Agora, não sei se você precisa disso neste caso, pois a regra está chamando um script, não um comando.

Outra observação: tente remover o !da "test!"string ou substitua as aspas duplas por aspas simples. O estrondo !provavelmente está causando problemas por causa de seu significado especial no shell e as aspas duplas preservam esse significado.

Comunidade
fonte
Com ou sem o !não está funcionando.
TCB13 9/09/12
RUN+="/bin/sh -c '/bin/echo test >> /test.txt'"funciona, mas por alguma razão nós obtivemos "teste" escrito 8 vezes no arquivo. Parece que o comando está sendo executado várias vezes: S
TCB13 09/09/12
3

Meu conselho seria definir a prioridade de registro de udevde errpara infocom

 udevadm control --log-priority=info

Se você deseja ver ainda mais informações, defina-o debug. Agora você pode encontrar informações muito detalhadas do que udevfez /var/log/daemon.log(pelo menos em um sistema relacionado ao debian). Geralmente isso ajuda muito na busca de erros.

Este é apenas um complemento à resposta de htor, que provavelmente resolve seu problema.

user1146332
fonte