Script jalankan otomatis ketika kartu Wifi dicolokkan (udev)

9

Saya sudah mencoba menggunakan udevuntuk membuat sistem Debian menjalankan skrip bash ketika kartu nirkabel terhubung.

Sejauh ini saya membuat file ini /etc/udev/rules.d/wifi-detect.rules:

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

Dan untuk saat ini, saya mencoba membuat test.shkonten ini berfungsi:

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

Tetapi untuk beberapa alasan, sepertinya tidak ada yang terjadi ketika saya menghubungkan kartu nirkabel, tidak ada test.txtfile yang dibuat.

lsusbKartu saya ada di:

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

Menjalankan udevadm monitor –envinilah yang terjadi ketika saya menghubungkan kartu:

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)

Saya sudah mencoba banyak contoh, tetapi saya tidak bisa membuatnya bekerja. Saya harap seseorang dapat membantu saya dengan yang ini;) Terima kasih!


EDIT:

Untuk mempermudah, saya mengubah aturan saya menjadi:

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

Saya berhasil mengatur udevadm control --log-priority=infoseperti yang disarankan @ user1146332 dan saya mendapatkan log yang menarik ini:

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

Jadi ... Bukankah return code 0kode keluar untuk penyelesaian yang berhasil? Jika demikian mengapa saya tidak mendapatkan file di sistem?


EDIT 2:

Saya berhasil mendapatkan tip ini menggunakan @htor. Aturan saya saat ini:

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

Tetapi dengan beberapa alasan perintah dijalankan sebanyak 8 kali, apakah ada cara untuk menghindari ini? Saya pikir ini terjadi karena ketika driver kartu nirkabel dimuat, mereka harus melepas dan memasang kartu tersebut. Kiat?

TCB13
sumber
1
terkait dengan EDIT: Saya yakin bahwa /bin/echoeksekusi berhasil seperti yang disarankan oleh log Anda. Output dari perintah Anda adalah test > /test.txtsebagai status log Anda. Alasan untuk ini adalah, bahwa karakter >tidak memiliki arti khusus sama sekali dalam konteks Anda. Itu hanya argumen baris perintah ketiga yang Anda terima echo. Anda mendapatkan apa yang Anda inginkan jika Anda membiarkan shell Anda mengartikan baris yang diberikan /bin/echo 'test' > /test.txt. Seperti yang Anda lakukan di EDIT kedua Anda. Misalnya, jika Anda membiarkan udeveksekusi touch /test.txtberbeda dengan apa yang telah Anda lakukan, Anda akan melihat file baru di root Anda.
user1146332

Jawaban:

4

Saya punya masalah serupa beberapa waktu lalu dan solusinya adalah mengubah RUN+=bagian RUN+="sh -c '/root/test.sh'". Sekarang, saya tidak tahu apakah Anda memerlukannya dalam kasus ini karena aturannya memanggil skrip, bukan perintah.

Pengamatan lain: coba hapus !dari "test!"string atau ganti tanda kutip ganda dengan tanda kutip tunggal. Ledakan !itu mungkin membuat masalah karena makna khusus di shell dan tanda kutip ganda mempertahankan makna itu.

Komunitas
sumber
Dengan atau tanpa !itu tidak berfungsi.
TCB13
RUN+="/bin/sh -c '/bin/echo test >> /test.txt'"berfungsi, tetapi karena beberapa alasan e mendapat "tes" yang ditulis 8 kali dalam file. Sepertinya perintah sedang dijalankan beberapa kali: S
TCB13
3

Saran saya akan untuk mengatur prioritas penebangan udevdari errke infodengan

 udevadm control --log-priority=info

Jika Anda ingin melihat lebih banyak informasi, aturlah debug. Sekarang Anda dapat menemukan informasi yang sangat terperinci tentang apa yang udevterjadi di /var/log/daemon.log(Setidaknya pada sistem terkait debian). Umumnya yang membantu banyak mengejar kesalahan.

Ini hanya pelengkap jawaban htor yang mungkin bisa menyelesaikan masalah Anda.

pengguna1146332
sumber