Come eseguire uno script quando è montata una specifica unità flash?


46

C'è un modo per eseguire uno script quando è montato un particolare dispositivo USB?

Conservo i miei video su una USB separata e vorrei eseguire uno script che monterebbe la cartella video sul dispositivo USB su quella nella cartella home.

Risposte:


31

Adesso c'è una soluzione molto migliore con systemd . Crei un servizio che dipende e è desiderato dai tuoi media, ad esempio:/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

Quindi devi avviare / abilitare il servizio:
sudo systemctl start your.service
sudo systemctl enable your.service

Dopo il montaggio, systemd attiva lo script trigger. Il vantaggio rispetto alla regola udev è che lo script si attiva davvero dopo il montaggio, non dopo aver aggiunto il dispositivo di sistema.

Caso d'uso : ho una partizione crittografata di cui voglio eseguire il backup automaticamente. Dopo aver aggiunto il dispositivo devo digitare la password. Se ho agganciato lo script di backup a udev, lo script tenta di essere eseguito nel momento in cui sto digitando la password, che fallirà.

Risorsa: scripting con udev

Nota: è possibile trovare l'unità del dispositivo con:systemctl list-units -t mount


Spero che aprile 2016 arriverà presto. Il prossimo LTS Ubuntu avrà systemd abilitato. AFAIK la bella soluzione di cui sopra ha bisogno di Ubuntu 15.04 o più recente.
Guettli,

Oh, pensavo che systemd fosse già in Ubuntu. In realtà sto eseguendo debian stretch ;-)
sumid

@sumid Se voglio metterlo in ~ / .config / systemd, funzionerà?
Khurshid Alam,

4
Grande! Testato su Debian Jessie. Non dimenticare di abilitare il tuo servizio systemctl enable your.service. Il file di script deve essere eseguibile.
Corni,

1
Per me questo fallisce. Quando provo ad avviare il servizio, si lamenta con "Unità media-bb.mount non trovata". Ho chiamato il "bb" della mia chiavetta USB (FAT32) per assicurarmi che non ci siano caratteri strani e che non sia troppo lungo o qualcosa del genere. Ho provato le Requires=, After=e WantedBy=le linee sia con media-bb.mounte media-BB.mountperché mi mostra Nautilus il volume come "BB", non "BB". Stesso messaggio di errore, ad eccezione della maiuscola. Cosa c'è che non va? Devo in qualche modo creare quel media-<something>.mountservizio?
UTF-8

29

Inizia trovando il tuo dispositivo lsusb. Nota l'ID (ad es. 0a81:0101)

Crea un nuovo file di regole udev in /etc/udev/rules.d/via sudoedit /etc/udev/rules.d/100-mount-videos.rulese inserisci una nuova regola in questo modo:

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

Nota come ho usato l'ID da lsusb.

Quindi devi solo scrivere la sceneggiatura per fare il lavoro. Un semplice comando mount dovrebbe funzionare. Potresti aver bisogno di un sleep 5comando lì per attendere l'inizializzazione del filesystem (se lasci che gnome esegua il montaggio principale - ma sei libero di montarlo prima e quindi potresti non aver bisogno del sonno).

Aggiunta da Allan: gli script di lunga durata potrebbero bloccare "tutti gli altri eventi per questo o un dispositivo dipendente". La pagina man di My Mint afferma inoltre "Le attività di lunga durata devono essere immediatamente staccate dal processo dell'evento stesso". Non viene fornito alcun suggerimento su dove acquisire l'abilità per farlo.

Risposta di Oli: avvolgilo in questo modo: https://askubuntu.com/a/106359/449


4
Potrei suggerire il prefisso del comando "RUN" con "su your_user -c" in modo che lo script non sia in esecuzione con i privilegi di root.
Kees Cook,

3
@Kees Dato che l'obiettivo qui sta crescendo, mantenere i privilegi di root potrebbe essere una buona idea. Forse invece di mantenere lo script nella home dell'utente, lo tieni dentro /root/o da qualche parte dove solo root può modificarlo.
Oli

2
Questo non risponde alla domanda. La domanda chiede come eseguire uno script quando è montata un'unità USB . Questa risposta spiega come eseguire uno script che monta un'unità USB quando viene inserita . La differenza conta per me perché ho una sceneggiatura del genere (per una fotocamera digitale); senza lo script, l'unità può o può essere montata all'inserimento (a seconda delle impostazioni dell'utente) ed è solo quando l'unità è montata che voglio fare qualcosa (copiare le immagini). Quindi il mio script (che viene eseguito quando viene aggiunta l'unità) viene spesso eseguito nel momento sbagliato.
Reinier Post,


questo è un modo incredibilmente specifico (fragile) per raggiungere. Risposta @sumid più applicabile alle moderne distro usando systemd
MrMesees

8

Un altro modo per ottenere i valori di ATTRS {idVendor} e ATTRS {idProduct} (testato in Ubuntu 12.04) è:

  1. Trova dove è montato il tuo usb:

    $ mount | grep /dev/sd*
    

    questo mostra qualcosa di simile al seguente:

    /dev/sdb on /media/SOMEDIR type vfat ...
    
  2. Usa udevadm per ottenere le informazioni sul dispositivo:

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

    l'output dovrebbe essere simile a:

    E: ID_MODEL_ID=001a
    E: ID_VENDOR_ID=002b
    
  3. Ora usa l'id modello per ATTRS {idProduct} e l'id fornitore per ATTRS {idVendor}

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

1

In Nautilus sotto Modifica> Preferenze> Media puoi scegliere "altra azione" e "comando costum". per l'esecuzione di diversi tipi di media. A quel punto l'unità USB è già montata, ma suppongo che potresti ancora collegarla (con un comando costum) alla cartella in cui vuoi che appaia l'unità. Non saprei dire se sia più facile o migliore dell'uso di udev.


il comando indossa un costume? o un costume?
Erjoalgo,

1

Se non vuoi interferire con il controllo del tuo filemanager (nautilus, konquerer, gnome, ecc.) Sul montaggio e lo smontaggio del tuo dispositivo, ti suggerisco di non seguire la rotta udev.

Invece, usa udisks-glue se il tuo sistema usa udisks (quasi tutti lo fanno).

Dopo l'installazione, basta creare un file di configurazione ~/.udisks-glue.confnella directory home in questo modo.

Il mio esempio seguente aggiorna i dati GPS-Assist sulla mia fotocamera ogni volta che collego la scheda 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"
}

Successivamente, assicurati che udisks-glue si avvii all'avvio o al login. Vale a dire tramite le applicazioni di avvio di gnome


1
Non supporta udev2 :-(
sumid


0

La risposta di @ sumid ha un problema. Si dovrebbe non avviare il servizio. Devi solo abilitarlo.

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

Quindi abilitare il servizio:

sudo systemctl enable your.service

È tutto.

Nota: è possibile trovare l'etichetta mediale con:sudo systemctl list-units -t mount

Nota 2: se il servizio non riesce in qualche modo (ad esempio, lo script non è eseguibile), il punto di montaggio cambierà alla <old_mount_point_name>1prossima installazione del dispositivo USB. Per risolvere questo problema, devi solo eseguiresudo systemctl reset-failed

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.