Tập lệnh tự động chạy khi cắm thẻ Wifi (udev)


9

Tôi đã cố gắng sử dụng udevđể làm cho hệ thống Debian chạy tập lệnh bash khi thẻ không dây được kết nối.

Cho đến nay tôi đã tạo tập tin này /etc/udev/rules.d/wifi-detect.rules:

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

Và hiện tại, tôi đang cố gắng để làm cho test.shnội dung này hoạt động:

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

Nhưng vì một số lý do, dường như không có gì xảy ra khi tôi kết nối thẻ không dây, không có test.txttệp nào được tạo.

Của tôi lsusbtrên thẻ:

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

Chạy udevadm monitor –envđây là những gì xảy ra khi tôi kết nối thẻ:

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)

Tôi đã thử rất nhiều ví dụ xung quanh nhưng tôi không thể làm cho nó hoạt động được. Tôi hy vọng ai đó có thể giúp tôi với cái này;) Cảm ơn bạn!


BIÊN TẬP:

Để đơn giản hóa, tôi đã thay đổi quy tắc của mình thành:

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

Tôi đã quản lý để đặt udevadm control --log-priority=infothành @ user1146332 được đề xuất và tôi đã nhận được nhật ký thú vị này:

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

Vậy ... Không phải là return code 0mã thoát để hoàn thành thành công sao? Nếu vậy tại sao tôi không nhận được bất kỳ tập tin nào trên hệ thống?


EDIT 2:

Tôi đã quản lý để làm việc này bằng cách sử dụng mẹo của @htor. Quy tắc hiện tại của tôi:

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

Nhưng bởi một số lý do, lệnh được thực thi như 8 lần, có cách nào để tránh điều này không? Tôi nghĩ điều đó đang xảy ra bởi vì khi các trình điều khiển thẻ không dây đang được tải, họ cần hầu như ngắt kết nối và gắn thẻ. Lời khuyên?


1
liên quan đến EDIT: Tôi chắc chắn rằng việc đó /bin/echođã được thực hiện thành công như nhật ký của bạn gợi ý. Đầu ra của lệnh của bạn là test > /test.txttrạng thái nhật ký của bạn. Lý do cho điều này là, nhân vật >không có ý nghĩa đặc biệt nào trong bối cảnh của bạn. Nó chỉ là đối số dòng lệnh thứ ba mà bạn truyền vào echo. Bạn nhận được những gì bạn muốn nếu bạn để vỏ của bạn diễn giải dòng đã cho /bin/echo 'test' > /test.txt. Giống như bạn đã làm trong EDIT thứ hai của bạn. Chẳng hạn, nếu bạn để udevthực thi touch /test.txttrái ngược với những gì bạn đã làm, bạn sẽ thấy một tệp mới trong thư mục gốc của mình.
dùng114632

Câu trả lời:


4

Tôi đã có một vấn đề tương tự một thời gian trước đây và giải pháp là thay đổi RUN+=một phần RUN+="sh -c '/root/test.sh'". Bây giờ, tôi không biết nếu bạn cần điều đó trong trường hợp này vì quy tắc đang gọi một kịch bản, không phải là một lệnh.

Một quan sát khác: thử loại bỏ chuỗi !khỏi "test!"hoặc thay thế dấu ngoặc kép bằng dấu ngoặc đơn. Tiếng nổ !có lẽ đang gây rắc rối vì ý nghĩa đặc biệt của nó trong vỏ và dấu ngoặc kép bảo tồn ý nghĩa đó.


Có hoặc không có !nó không hoạt động.
TCB13

RUN+="/bin/sh -c '/bin/echo test >> /test.txt'"hoạt động, nhưng vì lý do nào đó e đã "kiểm tra" được viết 8 lần trong tập tin. Có vẻ như lệnh đang được thực thi nhiều lần: S
TCB13

3

Tư vấn cho tôi sẽ được thiết lập các ưu tiên khai thác gỗ của udevtừ errđể info

 udevadm control --log-priority=info

Nếu bạn muốn xem thêm thông tin, hãy đặt nó debug. Bây giờ bạn có thể tìm thấy thông tin rất chi tiết về những gì udevđã làm /var/log/daemon.log(Ít nhất là trên một hệ thống liên quan đến debian). Nói chung là giúp rất nhiều lỗi đuổi theo.

Đây chỉ là một bổ sung cho câu trả lời của htor có thể giải quyết vấn đề của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.