GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo ejecutar un shellscript cuando conecto un dispositivo USB

Si desea ejecutar el script en un dispositivo específico, puede usar las identificaciones de proveedor y producto

  • En /etc/udev/rules.d/test.rules :

    ATTRS{idVendor}=="152d", ATTRS{idProduct}=="2329", RUN+="/tmp/test.sh"
    
  • en test.sh :

    #! /bin/sh
    
    env >>/tmp/test.log
    file "/sys${DEVPATH}" >>/tmp/test.log
    
    if [ "${ACTION}" = add -a -d "/sys${DEVPATH}" ]; then
    echo "add ${DEVPATH}" >>/tmp/test.log
    fi
    

Con env , puede ver qué entorno está configurado desde udev y con file , descubrirá el tipo de archivo.

Los atributos concretos de su dispositivo se pueden descubrir con lsusb

lsusb

da

...
Bus 001 Dispositivo 016:ID 152d:2329 JMicron Technology Corp. / JMicron USA Technology Corp. JM20329 Puente SATA
...


No se trata directamente de tu pregunta, sino de lo que estás haciendo. Si inicia un script de copia de seguridad desde udev, se enfrentará a dos problemas principales:

  1. Su secuencia de comandos podría iniciarse antes de que el dispositivo esté listo y pueda montarse, debe mantener la condición KERNEL=="sd*" si desea utilizar el nodo /dev para montarlo
  2. Más importante aún, si su secuencia de comandos tarda algún tiempo en ejecutarse (lo que puede ser fácilmente el caso con una secuencia de comandos de respaldo), se eliminará poco después de que se inicie (alrededor de 5 segundos)
  3. Enfrentará muchos problemas complicados de permisos de usuario

Mi consejo es crear una secuencia de comandos en su casa de usuario que escuche una canalización con nombre y que se iniciará de forma asíncrona como:

#!/bin/bash

PIPE="/tmp/IomegaUsbPipe"
REMOTE_PATH="/path/to/mount/point"
LOCAL_PATH="/local/path/"


doSynchronization()
{
  #your backup here
}

trap "rm -f $PIPE" EXIT

#If the pipe doesn't exist, create it
if [[ ! -p $PIPE ]]; then
    mkfifo $PIPE
fi

#If the disk is already plugged on startup, do a syn
if [[ -e "$REMOTE_PATH" ]]
then
    doSynchronization
fi

#Make the permanent loop to watch the usb connection
while true
do
    if read line <$PIPE; then
        #Test the message read from the fifo
        if [[ "$line" == "connected" ]]
        then
            #The usb has been plugged, wait for disk to be mounted by KDE
            while [[ ! -e "$REMOTE_PATH" ]]
            do
                sleep 1
            done
            doSynchronization
        else
            echo "Unhandled message from fifo : [$line]"
        fi
    fi
done
echo "Reader exiting"

Nota:uso el montaje automático con kde, así que verifico que aparezca la carpeta. Puede pasar el parámetro /dev/sd* en el fifo de la regla udev y montarlo usted mismo en el script. Para escribir en el fifo no olvides que udev no es un shell y que la redirección no funciona. Tu RUN debería ser como:

EJECUTAR+="/bin/sh -c '/bin/echo conectado>> /tmp/IomegaUsbPipe'"


He publicado una solución en https://askubuntu.com/a/516336 y también estoy copiando y pegando la solución aquí.

Escribí un script de Python usando pyudev que dejo ejecutándose en segundo plano. Ese script escucha los eventos de udev (por lo tanto, es muy eficiente) y ejecuta cualquier código que yo quiera. En mi caso, ejecuta xinput comandos para configurar mis dispositivos (enlace a la versión más reciente).

Aquí hay una versión corta del mismo script:

#!/usr/bin/env python3

import pyudev
import subprocess

def main():
    context = pyudev.Context()
    monitor = pyudev.Monitor.from_netlink(context)
    monitor.filter_by(subsystem='usb')
    monitor.start()

    for device in iter(monitor.poll, None):
        # I can add more logic here, to run different scripts for different devices.
        subprocess.call(['/home/foo/foobar.sh', '--foo', '--bar'])

if __name__ == '__main__':
    main()

Linux
  1. Cómo ejecutar automáticamente comandos/secuencias de comandos durante el reinicio o el inicio

  2. ¿Cómo agregar nuevas líneas en variables en Bash Script?

  3. ¿Cómo establecer parámetros cuando Pipe Bash Script to Bash?

  4. Cómo ejecutar un script cuando se conectan o eliminan dispositivos USB mediante UDEV

  5. ¿Cómo ejecutar el script de Python desde Java?

¿Cómo ejecutar Sh Script desde un acceso directo de escritorio?

¿Cómo ejecutar un comando en un script de Shell?

Cómo ejecutar un script cuando finaliza la sesión de xfce

Cómo ejecutar un archivo sin extensión .sh en shell

¿Cómo ejecuto múltiples comandos cuando uso find?

¿Cómo ejecutar un script cuando llega un correo al servidor de correo? (Debian)