จะรันสคริปต์ได้อย่างไรเมื่อติดตั้งแฟลชไดรฟ์เฉพาะ


46

มีวิธีเรียกใช้สคริปต์เมื่อติดตั้งอุปกรณ์ USB เฉพาะหรือไม่

ฉันเก็บวิดีโอของฉันไว้ใน USB แยกต่างหากและต้องการเรียกใช้สคริปต์ที่จะติดตั้งโฟลเดอร์วิดีโอบนอุปกรณ์ USB เข้ากับวิดีโอในโฟลเดอร์โฮม

คำตอบ:


31

มีวิธีการแก้ปัญหาที่ดีกว่าด้วยsystemdตอนนี้ คุณสร้างบริการที่ขึ้นอยู่กับสื่อที่คุณต้องการเช่น:/etc/systemd/system/your.service

[Unit]
Description=My flashdrive script trigger
Requires=media-YourMediaLabel.mount
After=media-YourMediaLabel.mount

[Service]
ExecStart=/home/you/bin/triggerScript.sh

[Install]
WantedBy=media-YourMediaLabel.mount

จากนั้นคุณต้องเริ่ม / เปิดใช้บริการ:
sudo systemctl start your.service
sudo systemctl enable your.service

หลังจากเมานต์ systemd จะยิงสคริปต์ทริกเกอร์ของคุณ ข้อได้เปรียบเหนือกฎ udev ก็คือสคริปต์จะทำงานจริงหลังจากการเมานท์ไม่ใช่หลังจากเพิ่มอุปกรณ์ระบบ

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

ทรัพยากร: การเขียนสคริปต์ด้วย udev

หมายเหตุ:คุณสามารถค้นหาหน่วยอุปกรณ์ของคุณด้วย:systemctl list-units -t mount


ฉันหวังว่าเมษายน 2016 จะมาเร็ว ๆ นี้ Ubuntu LTS ตัวต่อไปจะเปิดใช้งาน systemd AFAIK ทางออกที่ดีจากข้างบนต้องการ Ubuntu 15.04 หรือใหม่กว่า
guettli

โอ้ฉันคิดว่า systemd อยู่ในอูบุนตูแล้ว จริง ๆ แล้วฉันกำลังใช้ debian stretch ;-)
sumid

@sumid หากฉันต้องการวางไว้ใต้ ~ / .config / systemd มันจะทำงานได้ไหม?
Khurshid Alam

4
ที่ดี! ทดสอบใน Debian Jessie systemctl enable your.serviceอย่าลืมที่จะเปิดใช้บริการของคุณ ไฟล์สคริปต์ต้องสามารถเรียกใช้งานได้
Corni

1
สำหรับฉันสิ่งนี้ล้มเหลว เมื่อฉันพยายามเริ่มบริการมันบ่นกับ "Unit media-bb.mount ไม่พบ" ฉันเรียกว่า thumb drive ของฉัน (FAT32) FS "bb" เพื่อให้แน่ใจว่าไม่มีตัวละครแปลก ๆ อยู่ในนั้นและไม่นานเกินไปหรืออะไรทำนองนี้ ฉันพยายามRequires=, After=และWantedBy=สายทั้งที่มีmedia-bb.mountและmedia-BB.mountเพราะแสดงให้เห็นว่าฉัน Nautilus ปริมาณเป็น "บีบี" ไม่ "บีบี" ข้อความแสดงข้อผิดพลาดเดียวกันยกเว้นการใช้อักษรตัวพิมพ์ใหญ่ เกิดอะไรขึ้น ฉันต้องสร้างmedia-<something>.mountบริการนั้นหรือไม่?
UTF-8

29

lsusbเริ่มต้นด้วยการหาอุปกรณ์ของคุณ จดบันทึก ID (เช่น0a81:0101)

สร้างไฟล์กฎ udev ใหม่/etc/udev/rules.d/ผ่านทางsudoedit /etc/udev/rules.d/100-mount-videos.rulesและสร้างกฎใหม่ที่นั่น:

ACTION=="add", ATTRS{idVendor}=="0a81", ATTRS{idProduct}=="0101", RUN+="/home/your_username/bin/mount_videos.sh"

สังเกตว่าฉันใช้ ID จากlsusbอย่างไร

จากนั้นคุณเพียงแค่ต้องเขียนสคริปต์เพื่อทำงาน คำสั่ง mount แบบง่ายควรใช้งานได้ คุณอาจจำเป็นต้องมีsleep 5คำสั่งเพื่อรอให้ระบบไฟล์เริ่มต้น (ถ้าคุณปล่อยให้ gnome ทำการติดตั้งหลัก - แต่คุณมีอิสระที่จะติดมันก่อนแล้วคุณอาจไม่จำเป็นต้องหลับ)

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

ตอบกลับจาก Oli:ห่อเหมือน: https://askubuntu.com/a/106359/449


4
ฉันอาจแนะนำคำนำหน้าคำสั่ง "RUN" ด้วย "su your_user -c" เพื่อให้สคริปต์ไม่ได้ทำงานด้วยสิทธิ์พิเศษของรูท
Kees Cook

3
@ Kees เนื่องจากเป้าหมายที่นี่กำลังเพิ่มขึ้นการรักษาความเป็นส่วนตัวของรูทอาจเป็นความคิดที่ดี บางทีแทนที่จะเก็บสคริปต์ไว้ในบ้านของผู้ใช้คุณเก็บไว้ในที่/root/ใดที่ที่ root เท่านั้นที่สามารถแก้ไขได้
Oli

2
สิ่งนี้ไม่ตอบคำถาม คำถามที่ถามวิธีการเรียกใช้สคริปต์เมื่อไดรฟ์ USB จะติดตั้ง คำตอบนี้กล่าวว่าวิธีการทำเรียกใช้สคริปต์ที่ไม่เมาท์ไดรฟ์ USB เมื่อมีการแทรก ความแตกต่างสำคัญสำหรับฉันเพราะฉันมีสคริปต์ (สำหรับกล้องดิจิตอล); ไม่มีสคริปต์ไดรฟ์อาจหรืออาจจะติดตั้งในการแทรก (ขึ้นอยู่กับการตั้งค่าของผู้ใช้) และก็ต่อเมื่อไดรฟ์ติดตั้งที่ฉันต้องการจะทำบางสิ่งบางอย่าง (คัดลอกภาพ) ดังนั้นสคริปต์ของฉัน (ซึ่งทำงานเมื่อมีการเพิ่มไดรฟ์) มักจะทำงานในเวลาที่ไม่ถูกต้อง
Reinier Post


นี่เป็นวิธีที่บรรลุผลอย่างไม่น่าเชื่อ คำตอบ @sumid เพิ่มเติมที่ใช้บังคับกับ distro ที่ทันสมัยโดยใช้systemd
MrMesees

8

อีกวิธีหนึ่งในการรับค่าสำหรับ ATTRS {idVendor} และ ATTRS {idProduct} (ทดสอบใน Ubuntu 12.04) คือ:

  1. ค้นหาตำแหน่งที่ติดตั้ง usb ของคุณ:

    $ mount | grep /dev/sd*
    

    สิ่งนี้แสดงสิ่งต่อไปนี้:

    /dev/sdb on /media/SOMEDIR type vfat ...
    
  2. ใช้ udevadm เพื่อรับข้อมูลอุปกรณ์ดังกล่าว:

    udevadm info -q all -n /dev/sdb | grep -E -i -w '.*VENDOR_ID.*|.*MODEL_ID.*'
    

    ผลลัพธ์ควรเป็นดังนี้:

    E: ID_MODEL_ID=001a
    E: ID_VENDOR_ID=002b
    
  3. ตอนนี้ใช้รหัสรุ่นสำหรับ ATTRS {idProduct} และรหัสผู้ขายสำหรับ ATTRS {idVendor}

    ACTION=="add", ATTRS{idVendor}=="002b", ATTRS{idProduct}=="001a" ...
    

1

ใน Nautilus ภายใต้แก้ไข> การตั้งค่า> สื่อคุณสามารถเลือก "การกระทำอื่น ๆ " และ "คำสั่ง costum" สำหรับสื่อประเภทต่างๆที่จะดำเนินการ เมื่อถึงเวลานั้นไดรฟ์ usb ติดตั้งอยู่แล้ว แต่ฉันคิดว่าคุณยังคงสามารถเชื่อมโยง (ด้วยคำสั่ง costum) ไปยังโฟลเดอร์ที่คุณต้องการให้ไดรฟ์ปรากฏขึ้นมาฉันไม่สามารถบอกได้ว่ามันง่ายกว่าหรือดีกว่าการใช้ udev


คำสั่งสวมชุดอะไร? หรือ costum?
erjoalgo

1

หากคุณไม่ต้องการยุ่งเกี่ยวกับเครื่องมือจัดการไฟล์ (nautilus, konquerer, gnome, etc) ของการควบคุมการติดตั้งและยกเลิกการต่อเชื่อมอุปกรณ์ของคุณฉันขอแนะนำว่าอย่าไปเส้นทาง udev

ให้ใช้udisks-adhesiveแทนหากระบบของคุณใช้ udisks (เกือบทั้งหมดทำได้)

หลังจากติดตั้งเพียงแค่สร้างไฟล์กำหนดค่า~/.udisks-glue.confในไดเรกทอรีบ้านของคุณเช่นนี้

ตัวอย่างต่อไปนี้อัปเดตข้อมูล GPS-Assist ในกล้องของฉันทุกครั้งที่ฉันเสียบการ์ด SD

filter BT16EXTREME {
  optical = false
  partition_table = false
  usage = filesystem
  label = BT16EXTREME
}
match BT16EXTREME {
  post_mount_command = "/home/bernhard/update-gps-assist-data.pl %mount_point"
}

หลังจากนั้นตรวจสอบให้แน่ใจว่า udisks-glue เริ่มต้นเมื่อคุณบูตหรือลงชื่อเข้าใช้ คือผ่านแอปพลิเคชันเริ่มต้นของ gnome


1
ไม่รองรับ udev2 :-(
sumid


0

@ คำตอบของ sumid มีปัญหา คุณไม่ควรเริ่มบริการ คุณเพียงแค่ต้องเปิดใช้งาน

ไฟล์: /etc/systemd/system/your.service

[Unit]
Description=My flashdrive script trigger
Requires=media-YourMediaLabel.mount
After=media-YourMediaLabel.mount

[Service]
ExecStart=/any_path_even_inside_the_mount_point/script.sh

[Install]
WantedBy=media-YourMediaLabel.mount

จากนั้นเปิดใช้งานบริการ:

sudo systemctl enable your.service

นั่นคือทั้งหมดที่

หมายเหตุ:คุณสามารถค้นหาป้ายกำกับของคุณได้ที่:sudo systemctl list-units -t mount

Note2:หากบริการไม่สำเร็จ (ตัวอย่างเช่นสคริปต์ไม่สามารถใช้งานได้) จุดเชื่อมต่อของคุณจะเปลี่ยนเป็น<old_mount_point_name>1ครั้งต่อไปที่คุณเมานท์อุปกรณ์ usb ในการแก้ไขปัญหานี้คุณเพียงแค่ต้องดำเนินการsudo systemctl reset-failed

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