เรียกใช้สคริปต์อัตโนมัติเมื่อเสียบการ์ด Wifi (udev)


9

ฉันพยายามใช้udevเพื่อทำให้ระบบ Debian ใช้สคริปต์ทุบตีเมื่อเชื่อมต่อการ์ดไร้สาย

จนถึงตอนนี้ฉันสร้างไฟล์นี้/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
เกี่ยวข้องกับการแก้ไข: ฉันแน่ใจว่า/bin/echoดำเนินการสำเร็จตามบันทึกของคุณแนะนำ เอาต์พุตของคำสั่งtest > /test.txtของคุณเป็นสถานะบันทึกของคุณ เหตุผลของเรื่องนี้คือตัวละคร>นั้นไม่มีความหมายพิเศษเลยในบริบทของคุณ echoมันเป็นเพียงอาร์กิวเมนต์บรรทัดคำสั่งที่สามที่คุณส่งผ่านไปยัง /bin/echo 'test' > /test.txtคุณจะได้รับสิ่งที่คุณต้องการถ้าคุณปล่อยให้เปลือกของคุณตีความเส้นที่กำหนด เหมือนที่คุณทำใน EDIT ที่สองของคุณ ตัวอย่างเช่นถ้าคุณยอมให้เอ็กซีudevคิ้วท์touch /test.txtตรงกันข้ามกับสิ่งที่คุณทำคุณจะเห็นไฟล์ใหม่ในรูทของคุณ
user1146332

คำตอบ:


4

ผมมีปัญหาที่คล้ายกันในขณะที่ที่ผ่านมาและการแก้ปัญหาคือการเปลี่ยนส่วนร่วมในการRUN+= RUN+="sh -c '/root/test.sh'"ตอนนี้ฉันไม่รู้ว่าคุณต้องการสิ่งนี้ในกรณีที่กฎกำลังเรียกใช้สคริปต์ไม่ใช่คำสั่ง

ข้อสังเกตอื่น: ลองลบ!จาก"test!"สตริงหรือแทนที่เครื่องหมายคำพูดคู่ด้วยเครื่องหมายคำพูดเดี่ยว ปัง!อาจสร้างปัญหาเนื่องจากความหมายพิเศษของมันในเชลล์และเครื่องหมายอัญประกาศคู่รักษาความหมายนั้นไว้


ไม่!ว่ามันจะทำงานหรือไม่ก็ตาม
TCB13

RUN+="/bin/sh -c '/bin/echo test >> /test.txt'"ทำงานได้ แต่ด้วยเหตุผลบางอย่าง e ได้ "ทดสอบ" เขียน 8 ครั้งในไฟล์ ดูเหมือนว่าคำสั่งจะถูกดำเนินการหลายครั้ง: S
TCB13

3

คำแนะนำของฉันคือการตั้งค่าลำดับความสำคัญการบันทึกudevจากerrถึงinfoด้วย

 udevadm control --log-priority=info

debugหากคุณต้องการที่จะเห็นข้อมูลมากขึ้นตั้งค่าให้ ตอนนี้คุณสามารถค้นหาข้อมูลโดยละเอียดเกี่ยวกับสิ่งที่udevทำใน/var/log/daemon.log(อย่างน้อยในระบบที่เกี่ยวข้องกับเดเบียน) โดยทั่วไปแล้วจะช่วยไล่ข้อผิดพลาดมากมาย

นี่เป็นเพียงส่วนประกอบของคำตอบของ htor ที่อาจช่วยแก้ปัญหาของคุณได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.