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


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

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


44
2018-02-06 21:00


origine




risposte:


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

Crea un nuovo file di regole udev in /etc/udev/rules.d/ attraverso sudoedit /etc/udev/rules.d/100-mount-videos.rulese plonk 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 di mount dovrebbe funzionare. Potresti aver bisogno di un sleep 5 comando in là per aspettare che il filesystem inizializzi (se lasci gnome per fare il montaggio principale - ma sei libero di montarlo prima e poi potresti non aver bisogno di dormire).

Aggiunta da Allan: Gli script a esecuzione prolungata potrebbero bloccare "tutti gli altri eventi per questo o un dispositivo dipendente". La pagina di My Mint man afferma inoltre che "i task di lunga durata devono essere immediatamente separati dal processo stesso dell'evento". Non viene dato alcun suggerimento su dove acquisire l'abilità per farlo.

Risposta da Oli: Avvolgilo in questo modo: https://askubuntu.com/a/106359/449


29
2018-02-06 23:54



Potrei suggerire di anteporre il comando "RUN" con "su your_user -c" in modo che lo script non sia in esecuzione con i privilegi di root. - Kees Cook
@Kees Poiché l'obiettivo qui è il montaggio, mantenere i privilegi di root potrebbe essere una buona idea. Forse invece di mantenere lo script nella casa dell'utente, lo tenga dentro /root/ o da qualche parte dove solo root può modificarlo. - Oli♦
Questo non risponde alla domanda. La domanda chiede come eseguire uno script quando è presente un'unità USB a cavallo. Questa risposta dice come eseguire uno script che monta un'unità USB quando lo è inserito. La differenza è importante per me perché ho una sceneggiatura del genere (per una fotocamera digitale); senza lo script, l'unità può o può essere montata in fase di 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 l'unità viene aggiunta) spesso viene eseguito nel momento sbagliato. - Reinier Post
PS vedi ubuntuforums.org/showthread.php?t=1551835 - Reinier Post
questo è un modo incredibilmente specifico (fragile) da raggiungere. risposta @sumid più applicabile all'utilizzo della distro moderna systemd - MrMesees


C'è una soluzione molto più bella con systemd adesso. Crei un servizio che dipende ed è ricercato 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 mount systemd lancia il tuo script di trigger. Il vantaggio rispetto alla regola udev è che lo script spara davvero dopo il mount, non dopo l'aggiunta del dispositivo di sistema.

Caso d'uso: Ho una partizione criptata che voglio fare il backup automaticamente. Dopo aver aggiunto il dispositivo devo digitare la password. Se ho agganciato lo script di backup ad udev, lo script tenta di avviarsi nel momento in cui sto digitando la password, che fallirà.

Risorsa: Scripting con udev

Nota: Puoi trovare il tuo dispositivo con: sudo systemctl list-units -t mount


25
2017-09-29 08:51



Spero che l'aprile 2016 sia in arrivo. Il prossimo Ubuntu LTS avrà abilitato systemd. 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
Grande! Testato su Debian Jessie. Non dimenticare di abilitare il tuo servizio systemctl enable your.service. Il file di script deve essere eseguibile. - Corni
Per me, questo fallisce. Quando provo ad avviare il servizio, si lamenta con "Unità media-bb.mount non trovata.". Ho chiamato il mio "thumb drive" (FAT32) FS "bb" per assicurarmi che non ci fossero caratteri strani e che non sia troppo lungo o nulla del genere. Ho provato il Requires=, After=, e WantedBy= linee sia con media-bb.mount e media-BB.mount perché Nautilus mi mostra il volume come "BB", non "bb". Lo stesso messaggio di errore, ad eccezione delle lettere maiuscole. Cosa c'è che non va? Devo in qualche modo dovrei crearlo media-<something>.mount servizio? - UTF-8


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

  1. Trova dove è montato il tuo usb:

    $ mount | grep /dev/sd*
    

    questo mostra qualcosa come il seguente:

    /dev/sdb on /media/SOMEDIR type vfat ...
    
  2. Utilizza 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 qualcosa del tipo:

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

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

8
2017-09-18 23:11





In Nautilus sotto Modifica> Preferenze> Media puoi scegliere "altra azione" e poi "Comando costum". per diversi tipi di media da eseguire. A quel punto l'unità USB è già montata, ma suppongo che potresti comunque collegarla (con un comando personalizzato) alla cartella in cui vuoi che venga visualizzata l'unità. Non potrei dire se questo è più facile o meglio di usare udev.


1
2018-02-06 22:53



il comando indossa un costume? o un costume? - erjoalgo


Se non si desidera interferire con il controllo del file manager (nautilus, konquerer, gnome, ecc.) Sul montaggio e sullo smontaggio del dispositivo, suggerisco di non seguire la rotta udev.

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

Dopo l'installazione, basta creare un file di configurazione ~/.udisks-glue.confnella tua home directory come questa

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

In seguito assicurati che udisks-glue si avvii all'avvio o al log-in. Cioè tramite le applicazioni di avvio di gnome


1
2017-11-24 03:10



Non supporta udev2 :-( - sumid


usa udev

http://archive.atomicmpc.com.au/forums.asp?s=2&c=16&t=4775


0
2018-02-06 21:11





@ La risposta di sumid ha un problema. Dovresti non avvia 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: Puoi trovare il tuo marchio mediale con: sudo systemctl list-units -t mount

Nota 2: Se il servizio non è riuscito in qualche modo (ad esempio, lo script non è eseguibile), il punto di montaggio cambierà in <old_mount_point_name>1 la prossima volta che monterà il dispositivo USB. Per risolvere questo problema, devi solo eseguire sudo systemctl reset-failed


0
2017-12-11 10:57