Script d'exécution automatique lorsque la carte Wifi est connectée (udev)


9

J'ai essayé d'utiliser udevun système Debian pour exécuter un script bash lorsqu'une carte sans fil est connectée.

Jusqu'à présent, j'ai créé ce fichier /etc/udev/rules.d/wifi-detect.rules:

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

Et pour l'instant, j'essaye de faire fonctionner test.shce contenu:

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

Mais pour une raison quelconque, rien ne semble se produire lorsque je connecte la carte sans fil, aucun test.txtfichier n'est créé.

Mon lsusbsur la carte:

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

C'est udevadm monitor –envce qui se passe lorsque je connecte la carte:

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)

J'ai essayé beaucoup d'exemples mais je ne peux pas le faire fonctionner. J'espère que quelqu'un pourra m'aider avec celui-ci;) Merci!


ÉDITER:

Pour simplifier, j'ai changé ma règle en:

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

J'ai réussi à définir udevadm control --log-priority=infocomme @ user1146332 l'a suggéré et j'ai obtenu ce journal intéressant:

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

Alors ... N'est-ce pas le return code 0code de sortie pour une réussite? Si oui, pourquoi je ne reçois aucun fichier sur le système?


EDIT 2:

J'ai réussi à faire fonctionner cela en utilisant le conseil de @htor. Ma règle actuelle:

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

Mais pour une raison quelconque, la commande est exécutée 8 fois, existe-t-il un moyen d'éviter cela? Je pense que cela se produit parce que lorsque les pilotes de carte sans fil sont en cours de chargement, ils doivent pratiquement démonter et monter la carte. Conseils?


1
liés à EDIT: Je suis sûr que le a /bin/echoété exécuté avec succès comme le suggère votre journal. La sortie de votre commande est test > /test.txtconforme à l'état de votre journal. La raison en est que le personnage >n'a aucune signification particulière dans votre contexte. Il s'agit simplement du troisième argument de ligne de commande auquel vous êtes passé echo. Vous obtenez ce que vous voulez si vous laissez votre shell interpréter la ligne donnée /bin/echo 'test' > /test.txt. Comme vous l'avez fait lors de votre deuxième édition. Par exemple, si vous laissez udevexécuter touch /test.txtcontrairement à ce que vous avez fait, vous verrez un nouveau fichier dans votre racine.
user1146332

Réponses:


4

J'ai eu un problème similaire il y a quelque temps et la solution a été de changer la RUN+=pièce en RUN+="sh -c '/root/test.sh'". Maintenant, je ne sais pas si vous en avez besoin dans ce cas car la règle appelle un script, pas une commande.

Autre observation: essayez de supprimer le !de la "test!"chaîne ou remplacez les guillemets doubles par des guillemets simples. Le bang !fait probablement du mal à cause de sa signification particulière dans le shell et les guillemets doubles préservent cette signification.


Avec ou sans !ça ne marche pas.
TCB13

RUN+="/bin/sh -c '/bin/echo test >> /test.txt'"fonctionne, mais pour une raison quelconque, e "test" a été écrit 8 fois dans le fichier. Il semble que la commande soit exécutée plusieurs fois: S
TCB13

3

Mon conseil serait de définir la priorité de journalisation de udevà errà infoavec

 udevadm control --log-priority=info

Si vous souhaitez voir encore plus d'informations, réglez-le sur debug. Vous pouvez maintenant trouver des informations très détaillées sur ce qui udevs'est passé dans /var/log/daemon.log(au moins sur un système lié à Debian). Généralement, cela aide beaucoup à chasser les erreurs.

Ce n'est qu'un complément à la réponse de htor qui résout probablement votre problème.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.