การใช้กฎ udev เพื่อเรียกใช้สคริปต์บนการแทรก USB


17

ฉันพยายามตั้งค่าสคริปต์ให้ทำงานทุกครั้งที่เสียบอุปกรณ์ USB ฉันสร้างไฟล์/etc/udev/rules.d/90-local.rulesและเพิ่มกฎต่อไปนี้:

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

ปัญหาคือเมื่อเชื่อมต่อไดรฟ์ไม่มีอะไรเกิดขึ้น สคริปต์สำหรับจุดประสงค์ในการแก้ไขข้อบกพร่องนั้นมีจุดประสงค์เพื่อส่งการแจ้งเตือนด้วยการแจ้งเตือนการส่งซึ่งติดตั้งและใช้งานได้ดีจากเทอร์มินัล

เส้นทางไปยังสคริปต์นั้นถูกต้องเนื่องจากฉันใช้คำสั่งนั้นในเทอร์มินัลโดยไม่มีปัญหาใด ๆ


โปรแกรมป้องกันไวรัสของคุณทำงานหรือไม่ นี่คือพฤติกรรมที่จะเรียกการกระทำจากโปรแกรม AV จำนวนเท่าใดก็ได้ แม้ว่าฉันจะคาดหวังคำเตือนหากคุณปิดการใช้งานการแจ้งเตือนคุณอาจไม่เห็นยกเว้นในบันทึก ฉันขอแนะนำให้ปิดการใช้งานอินเทอร์เน็ตจากนั้นโปรแกรม AV ของคุณลองอีกครั้ง
zenbike

ใช้งาน Ubuntu 11.04 โดยไม่มีการติดตั้ง AV
JTeK

@zenbike: ทำไมจะเพิ่มกฎ udev ที่กำหนดเองเรียกโปรแกรมป้องกันไวรัส?
user1686

การเริ่มต้นสคริปต์ใด ๆ เกี่ยวกับการแทรกอุปกรณ์อาจทำให้เกิดผลบวกปลอมในชุด AV เพื่อสแกนอุปกรณ์แบบถอดได้ ทำไมฉันไม่รู้ มันเกิดขึ้นกับฉันด้วยสคริปต์ที่ติดตั้งมาจากโรงงานบน thumbdrive และ Avira AV ฉันรู้
zenbike

คำตอบ:


6

ผมมีปัญหาเดียวกัน. สิ่งนี้ใช้ได้กับฉัน:

ลองคัดลอกสคริปต์ของคุณ/usr/local/binและเปลี่ยนไดเรกทอรีใน.rulesไฟล์ของคุณ

นอกจากนี้ฉันไม่ทราบว่า SYSFS คืออะไร แต่ฉันต้องการใช้คุณสมบัติ ATTR

บรรทัดต่อไปนี้เป็นเนื้อหาของ.rulesไฟล์ของฉัน:

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

ATTRS{vendor}=="SanDisk "ส่วนหนึ่งหมายความว่าเพียง แต่Sandiskจะถูกตรวจพบ?
blade19899

7

notify-send ต้องการเข้าถึงเซสชันบัส DBus ของคุณซึ่งไม่สามารถทำได้ด้วยเหตุผลสองประการ:

  • ไม่มีข้อมูลเกี่ยวกับเซสชัน เมื่อเริ่มต้นโดย udev สคริปต์ของคุณจะไม่ทราบว่าคุณเข้าสู่ระบบที่ใดหรือคุณเข้าสู่ระบบเลย Multi-seat ที่มี X11 ยังคงมีความซับซ้อน แต่การสลับผู้ใช้สามารถใช้ได้ทั้ง X11 และคอนโซลเซสชัน หลายคนใช้ SSH, VNC และ NX ผ่านเครือข่าย

    (ใช้DISPLAY=:0งานได้ครึ่งหนึ่ง แต่ก็ยังคาดเดาได้ดีที่สุด)

  • ถูกปฏิเสธโดยนโยบาย DBus แม้ว่าสคริปต์ของคุณจะพบเซสชัน X11 ของคุณก็ตาม แต่ก็จะไม่สามารถส่งการแจ้งเตือนได้เนื่องจากสคริปต์กำลังทำงานrootแทนบัญชีผู้ใช้ของคุณ


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;เคล็ดลับสำหรับฉันด้วยการแจ้งเตือนส่ง
mlt

1

คุณสามารถลองจับคู่อุปกรณ์โดยผู้จำหน่ายและรหัสผลิตภัณฑ์แทน กฎที่กำหนดเองต่อไปนี้ใช้งานได้สำหรับฉัน:

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

คุณสามารถเห็น idVendor และ idProduct ในเอาต์พุต lsusb หรือ dmesg หลังจากติดอุปกรณ์


ฉันลองแล้วและมันก็ใช้ไม่ได้เช่นกัน ... (ATTR {idProduct} == "5530") ... จำเป็นต้องมีผู้ขายหรือไม่ ฉันไม่คิดอย่างนั้น ...
JTeK

ในกรณีนั้นปัญหาอาจเกิดจากตัวสคริปต์เอง ตัวอย่างเช่นมันอาจขึ้นอยู่กับตัวแปร $ PATH env สำหรับการทดสอบให้ลองเรียกใช้งานเช่น export PATH = ''; /home/jesse/Documents/Scripts/cruzer.sh
Aleh

1

ติดตามคำตอบของ Aleh: ถ้าคุณยังต้องการการตรวจสอบเหตุการณ์ที่เกิดขึ้นคุณจะต้องมองหาตัวแปรสภาพแวดล้อมที่มีชื่อremove ID_SERIALประกอบด้วยผู้ขายและรหัสผลิตภัณฑ์คั่นด้วยเครื่องหมายขีดล่าง:

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

กฎก็สั้นลงเช่นกัน


0

บางทีคุณอาจต้องเพิ่มsleepสคริปต์เพื่อให้อุปกรณ์ usb มีโอกาส "ชำระ" หรือไม่ ตัวอย่างเช่นโมเด็ม usb 3g การสลับโหมดเพื่อรับ a / dev / ttyUSB เพื่อให้เคอร์เนลเริ่มทำงาน


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