Bagaimana menjalankan skrip ketika flash-drive tertentu dipasang?

46

Apakah ada cara untuk menjalankan skrip ketika perangkat USB tertentu dipasang?

Saya menyimpan video saya di USB terpisah dan ingin menjalankan skrip yang akan memasang folder video di perangkat USB ke yang ada di folder rumah.

Braiam
sumber

Jawaban:

31

Ada banyak solusi yang lebih baik dengan systemd sekarang. Anda membuat layanan yang tergantung dan diinginkan oleh media Anda mis:/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

Maka Anda harus memulai / mengaktifkan layanan:
sudo systemctl start your.service
sudo systemctl enable your.service

Setelah mount, systemd akan mengaktifkan skrip trigger Anda. Keuntungan dari aturan udev adalah skrip benar-benar aktif setelah mount, bukan setelah menambahkan perangkat sistem.

Gunakan case : Saya memiliki partisi crypted yang ingin saya backup secara otomatis. Setelah menambahkan perangkat saya harus mengetikkan kata sandi. Jika saya mengaitkan skrip cadangan ke udev, skrip mencoba untuk menjalankan pada saat saya mengetik kata sandi, yang akan gagal.

Sumber: Scripting dengan udev

Catatan: Anda dapat menemukan unit perangkat Anda dengan:systemctl list-units -t mount

Sumid
sumber
Saya harap April 2016 akan segera hadir. Ubuntu LTS berikutnya akan memiliki systemd diaktifkan. AFAIK solusi yang bagus dari kebutuhan di atas Ubuntu 15.04 atau lebih baru.
guettli
Oh, saya pikir systemd sudah ada di ubuntu. Saya sebenarnya menjalankan debian stretch ;-)
sumid
@sumid Jika saya ingin meletakkannya di bawah ~ / .config / systemd, apakah ini akan berfungsi?
Khurshid Alam
4
Bagus! Diuji dalam Debian Jessie. Jangan lupa untuk mengaktifkan layanan Anda systemctl enable your.service. File skrip harus dapat dieksekusi.
Corni
1
Bagi saya, ini gagal. Ketika saya mencoba memulai layanan, ia mengeluh dengan "Unit media-bb.mount tidak ditemukan.". Saya menyebut "bb" thumb drive saya (FAT32) untuk memastikan tidak ada karakter aneh di dalamnya dan tidak terlalu panjang atau yang seperti ini. Saya mencoba Requires=, After=dan WantedBy=garis-garis baik dengan media-bb.mountdan media-BB.mountkarena Nautilus menunjukkan saya volume sebagai "BB", bukan "bb". Pesan kesalahan yang sama, kecuali untuk kapitalisasi. Apa yang salah? Apakah saya harus membuat media-<something>.mountlayanan itu?
UTF-8
29

Mulailah dengan menemukan perangkat Anda lsusb. Catat ID (mis. 0a81:0101)

Buat file aturan udev baru di /etc/udev/rules.d/via sudoedit /etc/udev/rules.d/100-mount-videos.rulesdan plonk aturan baru di sana seperti ini:

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

Perhatikan bagaimana saya menggunakan ID dari lsusb.

Maka Anda hanya perlu menulis skrip untuk melakukan pekerjaan. Perintah mount sederhana harus bekerja. Anda mungkin memerlukan sleep 5perintah di sana untuk menunggu inisialisasi sistem file (jika Anda membiarkan gnome untuk melakukan pemasangan utama - tetapi Anda bebas untuk memasangnya terlebih dahulu dan kemudian Anda mungkin tidak perlu tidur).

Tambahan dari Allan: Skrip yang berjalan lama mungkin memblokir "semua acara lebih lanjut untuk ini atau perangkat yang tergantung". Halaman buku Mint saya lebih lanjut menyatakan "Tugas yang sudah berjalan lama harus segera dilepaskan dari proses acara itu sendiri." Tidak ada tip yang diberikan tentang tempat untuk mendapatkan keterampilan untuk melakukan ini.

Balas dari Oli: Bungkus seperti ini: https://askubuntu.com/a/106359/449

Oli
sumber
4
Saya mungkin menyarankan awalan perintah "RUN" dengan "su your_user -c" sehingga skrip tidak berjalan dengan hak akses root.
Kees Cook
3
@Kees Karena tujuannya di sini sedang meningkat, menjaga root privs mungkin ide yang bagus. Mungkin alih-alih menyimpan skrip di rumah pengguna, Anda menyimpannya di /root/atau di suatu tempat di mana hanya root yang dapat mengeditnya.
Oli
2
Ini tidak menjawab pertanyaan. Pertanyaannya menanyakan bagaimana menjalankan skrip ketika drive USB dipasang . Jawaban ini mengatakan bagaimana menjalankan skrip yang me-mount drive USB ketika dimasukkan . Perbedaannya penting bagi saya karena saya memiliki skrip seperti itu (untuk kamera digital); tanpa skrip, drive mungkin atau mungkin dipasang pada penyisipan (tergantung pada pengaturan pengguna) dan hanya ketika drive dipasang saya ingin melakukan sesuatu (menyalin gambar). Jadi skrip saya (yang berjalan saat drive ditambahkan) sering berjalan pada waktu yang salah.
Reinier Post
ini adalah cara yang sangat spesifik (rapuh) untuk dicapai. @jumlah jawaban yang lebih berlaku untuk distro modern menggunakan systemd
MrMesees
8

Cara lain untuk mendapatkan nilai untuk ATTRS {idVendor} dan ATTRS {idProduct} (diuji di Ubuntu 12.04) adalah:

  1. Temukan di mana usb Anda terpasang:

    $ mount | grep /dev/sd*
    

    ini menunjukkan sesuatu seperti berikut:

    /dev/sdb on /media/SOMEDIR type vfat ...
    
  2. Gunakan udevadm untuk mendapatkan info perangkat itu:

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

    outputnya harus seperti:

    E: ID_MODEL_ID=001a
    E: ID_VENDOR_ID=002b
    
  3. Sekarang gunakan id model untuk ATTRS {idProduct} dan id vendor untuk ATTRS {idVendor}

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

Dalam Nautilus di bawah Edit> Preferensi> Media Anda dapat memilih "tindakan lain" dan daripada "perintah costum". untuk berbagai jenis media yang akan dieksekusi. Pada saat itu, drive usb sudah terpasang, tetapi saya kira Anda masih bisa menautkannya (dengan perintah costum) ke folder tempat Anda ingin drive tersebut muncul. Saya tidak tahu apakah ini lebih mudah atau lebih baik daripada menggunakan udev.

daging babi asap
sumber
apakah perintah itu memakai kostum? atau costum?
erjoalgo
1

Jika Anda tidak ingin mengganggu kontrol filemanager Anda (nautilus, konquerer, gnome, dll.) Atas pemasangan dan pelepasan perangkat Anda, saya sarankan untuk tidak pergi ke rute udev.

Alih-alih, gunakan udisks-lem jika sistem Anda menggunakan udisks (hampir semuanya).

Setelah menginstal, cukup buat file config ~/.udisks-glue.confdi direktori home Anda seperti ini.

Contoh berikut saya memperbarui data GPS-Assist di kamera saya setiap kali saya mencolokkan SD-card.

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"
}

Setelah itu pastikan lem-udisks mulai ketika Anda boot atau masuk. Yaitu melalui aplikasi startup gnome

xro
sumber
1
Tidak mendukung udev2 :-(
sumid
0

Jawaban @ sumid memiliki masalah. Anda tidak boleh memulai layanan. Anda hanya perlu mengaktifkannya.

mengajukan: /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

Kemudian aktifkan layanan:

sudo systemctl enable your.service

Itu saja.

Catatan: Anda dapat menemukan label medial Anda dengan:sudo systemctl list-units -t mount

Note2: Jika layanan gagal entah bagaimana (misalnya, skrip tidak dapat dieksekusi), titik pemasangan Anda akan berubah ke <old_mount_point_name>1waktu berikutnya Anda memasang perangkat usb. Untuk memperbaiki masalah ini, Anda hanya perlu mengeksekusisudo systemctl reset-failed

sgon00
sumber