Ejecute un script automáticamente después de enchufar o desconectar un dispositivo USB

22

¿Qué puedo hacer para ejecutar automáticamente un script después de montar / enchufar o desmontar / desconectar un dispositivo USB?

Radu Rădeanu
fuente
2
@XxxXxx: no es una opción siempre que Cuttlefish no tenga una versión de lanzamiento para Ubuntu 12.10
Radu Rădeanu
2
posible duplicado: askubuntu.com/questions/25071/…
Glutanimate
@Glutanimate: esa pregunta es sobre una unidad flash USB específica, pero en general pregunté sobre un dispositivo USB
Radu Rădeanu
@Glutanimate: digamos que las respuestas de esa pregunta son útiles, de todos modos no responde a cómo ejecutar automáticamente un script después de desconectar un dispositivo USB.
Radu Rădeanu
1
"digamos que las respuestas de esa pregunta son útiles, de todos modos no responde a cómo ejecutar automáticamente un script después de desconectar un dispositivo USB" Supongo que si cambia "ACTION = 'add'" a "ACTION = 'eliminar' ", sería un buen lugar para comenzar.
Blujay

Respuestas:

17

Gracias a MinimusHeximus y los respectivos contribuyentes al hilo que mencionó en su comentario a mi pregunta similar, creo que ahora puedo ofrecerle la siguiente respuesta.

Necesitará 5 (cinco) archivos para un dispositivo USB como el siguiente, simplemente completando los valores respectivos <fortheseparts>:

/etc/udev/rules.d/00-usb-<yourdevice>.rules

ACTION=="add", ATTRS{idVendor}=="<yourvendorid>", ATTRS{idProduct}=="<yourproductid>", ENV{XAUTHORITY}="/home/<user>/.Xauthority", ENV{DISPLAY}=":0", OWNER="<user>", RUN+="/usr/local/bin/usb-<yourdevice>-in_udev"    
ACTION=="remove", ATTRS{idVendor}=="<yourvendorid>", ATTRS{idProduct}=="<yourproductid>", ENV{XAUTHORITY}="/home/<user>/.Xauthority", ENV{DISPLAY}=":0", OWNER="<user>", RUN+="/usr/local/bin/usb-<yourdevice>-out_udev"

/usr/local/bin/usb-<yourdevice>-in_udev

#!/bin/bash
/usr/local/bin/usb-<yourdevice>-in &

/usr/local/bin/usb-<yourdevice>-in

#!/bin/bash
sleep 1
<yourbashscriptcode>

/usr/local/bin/usb-<yourdevice>-out_udev

#!/bin/bash
/usr/local/bin/usb-<yourdevice>-out &

/usr/local/bin/usb-<yourdevice>-out

#!/bin/bash
sleep 1
<yourbashscriptcode>

Notas:

  1. Puede capturar los valores <yourvendorid>e <yourproductid>ingresando el comando lsusben la Terminal, cuando su dispositivo USB está enchufado, que enumerará todos sus dispositivos USB disponibles actualmente, por ejemplo Bus 003 Device 002: ID 8087:07da Intel Corp., donde 8087 es el VendorID y 07da es el ProductID .
  2. Y <yourdevice>puede ser cualquier nombre arbitrario que elija para su dispositivo USB, por ejemplo, elegí usar el nombre genérico " teclado " al crear dichos archivos para mi teclado USB que requería aplicar un diseño de teclado diferente cada vez que estaba enchufado.
  3. En algunos escenarios, puede que no sea necesario usar la ACTION=="remove"línea en el archivo de reglas de udev y, por lo tanto, los 2 (dos) outarchivos asociados " ", cuando no necesita hacer nada (por ejemplo, revertir un cambio realizado cuando el dispositivo está encendido enchufado) después de que el dispositivo esté desconectado.
Sadi
fuente
Esto se ve mal desde mi perspectiva de novato. ¿Esas cláusulas no tienen que estar en la misma línea?
nafg
1
Esto funciona: ACCIÓN == "agregar", ATTRS {idVendor} == "...", ATTRS {idProduct} == "...", ENV {XAUTHORITY} = "/ home / <user> /.Xauthority" , ENV {DISPLAY} = ": 0", RUN + = "<script>"
nafg
@nafg: desde mi perspectiva de novato, no debería hacer ninguna diferencia si coloca todos esos en una línea (usando una coma como separador) en el archivo de reglas udev, pero veo que ha agregado los parámetros XAUTHORITY y DISPLAY a las reglas udev, que podría funcionar para usted u otra persona, en cuyo caso me pregunto si ya no son necesarios en los dos archivos de script a continuación.
Sadi
1
sí, ese es el punto, ya no necesita el script intermedio (excepto quizás para poner el script real en segundo plano) ya que udev le permite configurar el entorno. Además, según los documentos de udev, cada línea es una regla independiente, las líneas en un archivo no se combinan.
nafg
@nafg: Gracias por tu valiosa contribución. Moví estos entornos a la regla udev y también funcionó para mí. Además, moví los scripts a / usr / local / bin cuando comencé a encontrar problemas después de mover mi carpeta / home a una partición separada (probablemente porque no se montó antes). Parece que usar saltos de línea en las reglas de udev no plantea ningún problema al menos en mi sistema (Ubuntu 13.04 64 bit) y preferí esto para facilitar la lectura.
Sadi