วิธีการใช้งานโปรแกรม C ++ ทุกครั้งที่เสียบแฟลชไดรฟ์ USB


9

ฉันมีโปรแกรม C ++ ที่เข้าถึงไดรฟ์ปากกา USB / แฟลชไดรฟ์ ใช้งานได้กับแฟลชไดรฟ์ที่เสียบอยู่ในปัจจุบัน โปรแกรม C ++ ปกติจะไม่ทำงานจนกว่าเราจะรัน แต่ฉันต้องการให้โปรแกรมทำงานโดยอัตโนมัติทุกครั้งที่ใส่แฟลชไดรฟ์ ฉันจะทำสิ่งนั้นได้อย่างไร

คำตอบ:


7

สำหรับการใช้งานทั่วไปหากคุณต้องการรันโปรแกรมสำหรับที่เก็บข้อมูล USB ใด ๆ ใช้ไดรเวอร์สำหรับการจับคู่กฎ

  1. เพิ่มudevไฟล์กฎ

    sudo nano /etc/udev/rules.d/90-detect-storage.rules
    
  2. เพิ่มกฎนี้

    ACTION=="add", DRIVERS=="usb-storage", DRIVER=="sd", RUN+="/pathto/yourprogram"
    

    หากคุณต้องการให้โปรแกรมของคุณแยกแยะดิสก์ดังนั้นจึงเรียกใช้การดำเนินการต่าง ๆ ให้ใช้ (คุณสามารถส่งผ่านหมายเลขซีเรียลหรือแอตทริบิวต์ที่คุณต้องการ):

    ACTION=="add", DRIVERS=="usb-storage", DRIVER=="sd", RUN+="/pathto/yourprogram $env{ID_VENDOR_ID} $env{ID_MODEL_ID}"
    
  3. โหลดกฎทั้งหมดใหม่

    sudo udevadm control --reload-rules
    
  4. ถอดปลั๊กและถอดแฟลชไดรฟ์ออก

หมายเหตุ:

  • ฉันใช้กฎนี้เพียงเพื่อทดสอบว่าสร้างบันทึกเมื่อมีการเรียกใช้กฎ:

    ACTION=="add", DRIVERS=="usb-storage", DRIVER=="sd", RUN+="/bin/sh -c 'echo $env{ID_VENDOR_ID} $env{ID_MODEL_ID} >> /home/username/Desktop/usb-storage.log'"
    
  • คุณสามารถแสดงความคิดเห็นกฎที่คุณไม่ต้องการโดยการเพิ่ม#ที่จุดเริ่มต้นของบรรทัด ไฟล์กฎสามารถมีได้หลายกฎ

  • ในการตรวจสอบenvตัวแปรทั้งหมดที่มีให้ใช้:

    ACTION=="add", DRIVERS=="usb-storage", RUN+="/bin/sh -c 'echo == >> /home/username/Desktop/usb-storage-env.log; env >> /home/username/Desktop/usb-storage-env.log'"
    
  • ในการตรวจสอบพารามิเตอร์ที่จะใช้สำหรับการจับคู่กฎให้เรียกใช้:

    sudo udevadm info --name=/dev/sdb1 --attribute-walk
    

อ้างอิง:


2
ฉันชอบวิธีนี้การ upvoting ขอแสดงความยินดี!
Frantique

2
+150: คำตอบที่ยอดเยี่ยม: (AFAIK ดีกว่าที่ยอมรับ) มันทำให้เป็นกฎทั่วไปสำหรับอุปกรณ์ USB ใด ๆ ในคำตอบที่ได้รับการรับรอง USB จะถูก จำกัด ให้ VID และ PID
Helio

5

คุณสามารถใช้udevเพื่อเรียกใช้คำสั่งแบบกำหนดเอง หากต้องการทำให้มันใช้งานได้ให้สร้างกฎใน/etc/udev/rules.d/:

sudo nano /etc/udev/rules.d/my-usb-device.rules

และป้อน:

ACTION=="add", ATTRS{idProduct}=="XXXX", ATTRS{idVendor}=="YYYY", RUN+="/location/of/my/command"

หมายเหตุ:XXXXและYYYYค่าจะถูกนำมาจากlsusbการส่งออก


ฉันไม่เห็นด้วย โปรแกรม C ++ คือ "คำสั่ง" หลังจากทั้งหมด ผู้ใช้กำลังขอวิธีแก้ปัญหาเพื่อทริกเกอร์คำสั่งนั้น (เขาพูดว่า: "แต่ฉันต้องการให้โปรแกรมทำงานโดยอัตโนมัติเมื่อใดก็ตามที่ใส่แฟลชไดรฟ์ฉันจะทำเช่นนั้นได้อย่างไร?")
Frantique

สำหรับผลลัพธ์ [ ideone.com/uOReNj ] ของ lsusb ค่าของXXXXและจะเป็นYYYYอย่างไร
vinayawsm

หาก pendrive ของคุณคือ Kingston มากกว่า: XXXX = 0951 และ YYYY = 162f
Frantique

หากต้องการให้ทริกเกอร์รหัสของฉันสำหรับไดรฟ์ปากกาที่แตกต่างกันทุกครั้งฉันควรอัปเดตไฟล์ "my-usb-device.rules" หรือไม่
vinayawsm

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