插入Wifi卡时自动运行脚本(udev)


9

我一直试图在udev连接无线网卡时使Debian系统运行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次,有没有办法避免这种情况?我认为这是正在发生的,因为在加载无线卡驱动程序时,它们实际上需要卸载并安装卡。提示?


1
与EDIT有关:我确定/bin/echo正如您的日志所建议的那样,已成功执行。命令的输出与test > /test.txt日志状态相同。原因是,>在您的上下文中,角色根本没有特殊含义。这只是您传递给的第三个命令行参数echo。如果让shell解释给定的行,则会得到所需的内容/bin/echo 'test' > /test.txt。就像您在第二次编辑中所做的一样。例如,如果您与udev执行touch /test.txt的操作相反,则您会在根目录中看到一个新文件。
user1146332 2012年

Answers:


4

前段时间我遇到了类似的问题,解决方案是将RUN+=零件更改为RUN+="sh -c '/root/test.sh'"。现在,我不知道您是否需要这种情况,因为规则是调用脚本而不是命令。

另一个观察结果:尝试!"test!"字符串中删除或将双引号替换为单引号。爆炸!可能在麻烦中,因为它在shell中具有特殊含义,而双引号保留了该含义。


有或没有!它都不起作用。
TCB13 2012年

RUN+="/bin/sh -c '/bin/echo test >> /test.txt'"可以,但是由于某种原因e在文件中写入了8次“测试”。好像命令被执行了多次:S
TCB13'9

3

我的建议是设置的记录优先udeverrinfo

 udevadm control --log-priority=info

如果您想查看更多信息,请将其设置为debug。现在,你可以找到的东西非常详细的信息udev在没有/var/log/daemon.log(至少在Debian相关的系统)。通常,这有助于追逐错误。

这只是对htor答案(可能解决您的问题)的补充。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.