¿Cómo ejecutar un script cuando se monta una unidad flash específica?

46

¿Hay alguna manera de ejecutar un script cuando se monta un dispositivo USB en particular?

Mantengo mis videos en un USB separado y me gustaría ejecutar un script que monte la carpeta de video en el dispositivo USB en la carpeta de inicio.

Braiam
fuente

Respuestas:

31

Hay una solución mucho mejor con systemd ahora. Usted crea un servicio que depende y es deseado por sus medios, por ejemplo:/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

Luego debe iniciar / habilitar el servicio:
sudo systemctl start your.service
sudo systemctl enable your.service

Después del montaje, systemd dispara su script de disparo. La ventaja sobre la regla de udev es que el script realmente se dispara después del montaje, no después de agregar el dispositivo del sistema.

Caso de uso : tengo una partición encriptada de la que quiero hacer una copia de seguridad automáticamente. Después de agregar el dispositivo, tengo que escribir la contraseña. Si enganché el script de respaldo a udev, el script intenta ejecutarse en el momento en que escribo la contraseña, lo que fallará.

Recurso: Scripting con udev

Nota: Puede encontrar la unidad de su dispositivo con:systemctl list-units -t mount

sumid
fuente
Espero que abril de 2016 llegue pronto. El próximo Ubuntu LTS tendrá systemd habilitado. AFAIK la buena solución de arriba necesita Ubuntu 15.04 o más reciente.
guettli
Oh, pensé que systemd ya está en ubuntu. De hecho, estoy ejecutando Debian
Stretch
@sumid Si quiero ponerlo en ~ / .config / systemd, ¿funcionará?
Khurshid Alam
44
¡Excelente! Probado en Debian Jessie. No olvide habilitar su servicio systemctl enable your.service. El archivo de script debe ser ejecutable.
Corni
1
Para mí, esto falla. Cuando intento iniciar el servicio, se queja con "Unidad media-bb.mount no encontrada". Llamé "bb" al FS de mi memoria USB (FAT32) para asegurarme de que no hay caracteres extraños y que no es demasiado largo ni nada parecido. Probé los Requires=, After=y WantedBy=las líneas de ambos con media-bb.mounty media-BB.mountporque me muestra el volumen Nautilus como "BB", no "BB". Mismo mensaje de error, excepto por mayúsculas. Que pasa ¿De alguna manera tengo que crear ese media-<something>.mountservicio?
UTF-8
29

Comience por encontrar su dispositivo en lsusb. Tenga en cuenta la identificación (por ejemplo 0a81:0101)

Cree un nuevo archivo de reglas de udev en /etc/udev/rules.d/via sudoedit /etc/udev/rules.d/100-mount-videos.rulesy coloque una nueva regla allí como esta:

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

Tenga en cuenta cómo usé la identificación de lsusb.

Entonces solo necesitas escribir el guión para hacer el trabajo. Un simple comando de montaje debería funcionar. Es posible que necesite un sleep 5comando allí para esperar a que el sistema de archivos se inicialice (si deja que gnome haga el montaje principal, pero puede montarlo primero y luego puede que no necesite dormir).

Adición de Allan: los scripts de larga ejecución podrían bloquear "todos los eventos posteriores para este o un dispositivo dependiente". Mi página de manual de Mint dice además: "Las tareas de ejecución prolongada deben separarse inmediatamente del proceso del evento en sí". No se dan consejos sobre dónde obtener la habilidad para hacer esto.

Respuesta de Oli: Envuélvelo así: https://askubuntu.com/a/106359/449

Oli
fuente
44
Podría sugerirle un prefijo al comando "EJECUTAR" con "su your_user -c" para que el script no se ejecute con privilegios de root.
Kees Cook,
3
@Kees Como el objetivo aquí es cada vez mayor, mantener los privilegios de root podría ser una buena idea. Quizás, en lugar de mantener el script en el hogar del usuario, lo guarde en un /root/lugar donde solo root pueda editarlo.
Oli
2
Esto no responde la pregunta. La pregunta pregunta cómo ejecutar un script cuando se monta una unidad USB . Esta respuesta dice cómo ejecutar un script que monta una unidad USB cuando se inserta . La diferencia me importa porque tengo un guión (para una cámara digital); sin la secuencia de comandos, la unidad puede o no estar montada en la inserción (dependiendo de la configuración del usuario) y es solo cuando la unidad está montada que quiero hacer algo (copiar las imágenes). Por lo tanto, mi script (que se ejecuta cuando se agrega la unidad) a menudo se ejecuta en el momento equivocado.
Reinier Post
Esta es una forma increíblemente específica (frágil) de lograr. Respuesta de @sumid más aplicable a las distribuciones modernas que usan systemd
MrMesees
8

Otra forma de obtener los valores para ATTRS {idVendor} y ATTRS {idProduct} (probado en Ubuntu 12.04) es:

  1. Encuentra dónde está montado tu usb:

    $ mount | grep /dev/sd*
    

    esto muestra algo como lo siguiente:

    /dev/sdb on /media/SOMEDIR type vfat ...
    
  2. Use udevadm para obtener la información de ese dispositivo:

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

    la salida debería ser algo como:

    E: ID_MODEL_ID=001a
    E: ID_VENDOR_ID=002b
    
  3. Ahora use la identificación del modelo para ATTRS {idProduct} y la identificación del proveedor para ATTRS {idVendor}

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

En Nautilus, en Edición> Preferencias> Medios, puede elegir "otra acción" y no "comando de costum". para que se ejecuten diferentes tipos de medios. En ese momento, la unidad USB ya está montada, pero supongo que aún podría vincularla (con un comando costum) a la carpeta en la que desea que aparezca la unidad. No podría decir si esto es más fácil o mejor que usar udev.

tocino
fuente
¿El comando usa un disfraz? o un vestuario?
erjoalgo
1

Si no desea interferir con el control de su administrador de archivos (nautilus, konquerer, gnome, etc.) sobre el montaje y desmontaje de su dispositivo, le sugiero que no siga la ruta udev.

En su lugar, use udisks-glue si su sistema usa udisks (casi todos lo hacen).

Después de la instalación, simplemente cree un archivo de configuración ~/.udisks-glue.confen su directorio de inicio como este.

El siguiente ejemplo actualiza los datos de GPS-Assist en mi cámara cada vez que conecto la tarjeta 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"
}

Después, solo asegúrese de que udisks-glue se inicie cuando inicie o inicie sesión. Es decir, a través de las aplicaciones de inicio de gnome

xro
fuente
1
No es compatible con udev2 :-(
sumid
0

La respuesta de @ sumid tiene un problema. Usted debe no iniciar el servicio. Solo necesitas habilitarlo.

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

Luego habilite el servicio:

sudo systemctl enable your.service

Eso es todo.

Nota: Puede encontrar su etiqueta medial con:sudo systemctl list-units -t mount

Nota 2: Si el servicio falla de alguna manera (por ejemplo, el script no es ejecutable), su punto de montaje cambiará a la <old_mount_point_name>1próxima vez que monte el dispositivo usb. Para solucionar este problema, solo necesita ejecutarsudo systemctl reset-failed

sgon00
fuente