Configuration

插入Wifi卡時自動執行腳本(udev)

  • July 17, 2019

我一直在嘗試使用udevDebian 系統在連接無線網卡時執行 bash 腳本。

到目前為止,我創建了這個文件/etc/udev/rules.d/wifi-detect.rules

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

現在,我正在嘗試test.sh使用這些內容:

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

但是由於某種原因,當我連接無線網卡時似乎沒有任何反應,沒有test.txt創建文件。

lsusb在卡上:

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

執行udevadm monitor –env這是我連接卡時發生的情況:

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)

我已經嘗試了很多例子,但我無法讓它工作。我希望有人可以幫助我解決這個問題;)謝謝!


編輯:

為了簡化事情,我將規則更改為:

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

我設法udevadm control --log-priority=info按照@user1146332 的建議進行設置,並得到了這個有趣的日誌:

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

所以……不就是return code 0成功完成的退出碼嗎?如果是這樣,為什麼我在系統上沒有任何文件?


編輯2:

我設法使用@htor 的提示來完成這項工作。我目前的規則:

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

但是由於某種原因,該命令被執行了 8 次,有沒有辦法避免這種情況?我認為正在發生,因為在載入無線卡驅動程序時,他們需要虛擬地解除安裝和安裝卡。提示?

前段時間我有一個類似的問題,解決方案是將RUN+=零件更改為RUN+="sh -c '/root/test.sh'". 現在,我不知道在這種情況下您是否需要它,因為規則是呼叫腳本,而不是命令。

另一個觀察:嘗試!"test!"字元串中刪除或用單引號替換雙引號。bang!可能會因為它在 shell 中的特殊含義而造成麻煩,而雙引號保留了該含義。

我的建議是將日誌記錄優先級設置為udevfromerrinfowith

udevadm control --log-priority=info

如果您想查看更多資訊,請將其設置為debug. 現在您可以找到非常詳細的資訊(至少在 debian 相關係統上)udev/var/log/daemon.log一般來說,這有助於很多追逐錯誤。

這只是對 htor 的回答的補充,它可能會解決您的問題。

引用自:https://unix.stackexchange.com/questions/47570