Menggunakan aturan udev untuk menjalankan skrip pada penyisipan USB


17

Saya mencoba menyiapkan skrip untuk dijalankan setiap kali saya mencolokkan perangkat USB. Saya membuat file /etc/udev/rules.d/90-local.rules dan menambahkan aturan berikut:

ACTION=="add", SUBSYSTEM=="usb", KERNEL=="sd*", SYSFS{model}=="Cruzer*", RUN+="sh /home/jesse/Documents/Scripts/cruzer.sh"

Masalahnya adalah ketika drive terhubung, tidak ada yang terjadi. Skrip, untuk keperluan debugging, dirancang untuk mengirim pemberitahuan dengan notifikasi-kirim, yang dipasang dan berfungsi dengan baik dari terminal.

Path ke script sudah benar, karena saya sudah menjalankan perintah yang tepat di terminal tanpa masalah.


Apakah antivirus Anda berjalan? Ini adalah perilaku yang akan memicu tindakan dari sejumlah program AV. Meskipun saya mengharapkan peringatan, jika Anda menonaktifkan notifikasi, Anda mungkin tidak melihatnya kecuali di log. Saya akan merekomendasikan menonaktifkan internet, kemudian program AV Anda, coba lagi.
zenbike

Menjalankan Ubuntu 11.04 tanpa AV diinstal.
JTeK

@zenbike: Mengapa menambahkan aturan udev khusus memicu program antivirus?
grawity

Memulai skrip apa pun pada penyisipan perangkat dapat menyebabkan kesalahan positif dalam set AV untuk memindai perangkat yang dapat dilepas. Kenapa, saya tidak tahu. Bahwa itu terjadi pada saya dengan skrip pabrik yang diinstal pada thumbdrive dan Avira AV, saya tahu.
zenbike

Jawaban:


6

Saya memiliki masalah yang sama. Ini bekerja untuk saya:

Coba salin skrip Anda ke dalam /usr/local/bindan ubah direktori di .rulesfile Anda .

Juga, saya tidak tahu apa itu SYSFS, tapi saya lebih suka menggunakan properti ATTR.

Baris berikut adalah isi dari .rulesfile saya :

ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd[a-z]1", ATTRS{vendor}=="SanDisk ", RUN+="/usr/local/bin/backup.sh"

yang ATTRS{vendor}=="SanDisk "bagian apakah itu berarti bahwa hanya Sandiskakan terdeteksi?
blade19899

7

notify-send membutuhkan akses ke bus sesi DBus Anda, yang tidak dapat dimilikinya karena dua alasan:

  • Tidak ada informasi tentang sesi ini. Ketika dimulai oleh udev, skrip Anda tidak tahu apa - apa tentang tempat Anda masuk atau jika Anda sama sekali masuk. Multi-kursi dengan X11 masih sulit, tetapi perpindahan pengguna berfungsi untuk sesi X11 dan konsol. Banyak orang juga menggunakan SSH, VNC dan NX melalui jaringan.

    ( DISPLAY=:0Akan bekerja setengah dari waktu, tapi itu masih tebakan terbaik.)

  • Ditolak oleh kebijakan DBus. Walaupun skrip Anda menemukan sesi X11 Anda, skrip tidak dapat mengirim pemberitahuan karena skrip dijalankan sebagai rootganti akun pengguna Anda.


2
for LINE in $(find /proc/ -maxdepth 2 -name environ -exec grep -z "^DBUS_SESSION_BUS_ADDRESS" {} \; | sort -uz | tr '\0' '\n'); do eval $LINE ... done;melakukan trik untuk saya dengan notify-send
mlt

1

Anda dapat mencoba mencocokkan perangkat dengan vendor dan ID produk sebagai gantinya. Aturan khusus berikut ini berfungsi untuk saya:

ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="0763", ATTR{idProduct}=="019b", RUN+="/usr/bin/aconnect 20 128"

Anda dapat melihat idVendor dan idProduct di output lsusb atau dmesg setelah memasang perangkat.


Saya mencobanya, dan tidak berhasil juga ... (ATTR {idProduct} == "5530") ... apakah vendor juga diperlukan? Saya tidak akan berpikir begitu ...
JTeK

Dalam hal ini masalahnya mungkin dengan skrip itu sendiri. Sebagai contoh mungkin tergantung pada variabel $ PATH env. Untuk tes coba jalankan seperti ekspor PATH = ''; /home/jesse/Documents/Scripts/cruzer.sh
Aleh

1

Menindaklanjuti jawaban Aleh: Jika Anda juga ingin memantau removeacara, Anda perlu mencari variabel lingkungan bernama ID_SERIAL. Ini berisi ID vendor dan produk yang dipisahkan oleh garis bawah:

ACTION=="add|remove", SUBSYSTEM=="usb", ENV{ID_SERIAL}=="0763_019b" RUN+="/usr/bin/aconnect 20 128"

Aturannya sekarang juga lebih pendek.


0

Mungkin, Anda mungkin perlu menambahkan sleepdalam skrip, untuk memberikan perangkat usb kesempatan untuk "menyelesaikan"? Sebagai contoh, modem usb 3g, mode switching untuk mendapatkan / dev / ttyUSB untuk ditendang dan dijalankan oleh kernel.


0

Coba ganti SUBSYSTEM = "usb" dengan SUBSYSTEMS = "usb"


Tidak, SUBSYSTEM=="usb"tidak apa-apa.
krlmlr
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.