J'ai essayé d'utiliser udev
un 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.sh
ce 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.txt
fichier n'est créé.
Mon lsusb
sur la carte:
Bus 001 Device 015: ID 0cf3:9271 Atheros Communications, Inc. AR9271 802.11n
C'est udevadm monitor –env
ce 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=info
comme @ 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 0
code 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?
la source
/bin/echo
été exécuté avec succès comme le suggère votre journal. La sortie de votre commande esttest > /test.txt
conforme à 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 laissezudev
exécutertouch /test.txt
contrairement à ce que vous avez fait, vous verrez un nouveau fichier dans votre racine.Réponses:
J'ai eu un problème similaire il y a quelque temps et la solution a été de changer la
RUN+=
pièce enRUN+="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.la source
!
ça ne marche pas.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: SMon conseil serait de définir la priorité de journalisation de
udev
àerr
àinfo
avecSi 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 quiudev
s'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.
la source