Come eseguire script personalizzati sul plug-in del dispositivo USB?


41

Qual è il metodo all'avanguardia per eseguire automaticamente script personalizzati su plug-in di dispositivi USB nelle attuali distribuzioni Linux come Debian / CentOS / Fedora?

Ad esempio, se si desidera montare / copiare automaticamente alcuni file / smontare un dispositivo di archiviazione di massa USB in base al suo UUID (o ID dispositivo ecc.).

Risposte:


27

Inserisci una linea come questa in un file in /etc/udev/rules.d:

KERNEL=="sd*", ATTRS{vendor}=="Yoyodyne", ATTRS{model}=="XYZ42", ATTRS{serial}=="123465789", RUN+="/pathto/script"

Aggiungi una clausola come NAME="subdir/mydisk%n"se desideri utilizzare un percorso di voce personalizzato in /dev.

Esegui udevadm info -a -n sdbper vedere a quali attributi puoi confrontare ( attribute=="value"; sostituisci sdbcon il nome del dispositivo assegnato automaticamente al disco, corrispondente alla nuova voce creata /devquando lo colleghi). Nota che puoi usare le ATTRSclausole da una qualsiasi stanza: puoi scegliere qualsiasi stanza, ma le ATTRSclausole devono provenire tutte dalla stessa stanza, non puoi mescolare e abbinare. È possibile combinare ATTRSclausole con altri tipi di clausole elencate in una stanza diversa.


1
Questa risposta è ancora valida? In nessun modo, posso ottenere l'esecuzione dello script (e toccare un file). Se puoi fornire l'esempio più semplice che esegue uno script quando qualcosa è collegato, sarebbe fantastico e possiamo lavorare da lì.
Redsandro,

@Redsandro Ho variazioni di questa regola nella mia configurazione udev e stanno funzionando. Hai collegato e riacceso il dispositivo o eseguito udevadm trigger? Il tuo sistema utilizza udev? Se vuoi eseguire uno script quando qualcosa è collegato, rimuovi tutte le condizioni (le clausole con ==) (forse la sintassi richiede una condizione, non ne sono sicuro; in caso affermativo, usa KERNEL=="*").
Gilles 'SO- smetti di essere malvagio' il

Ci ho provato anche io, ma dato che funziona per te, mi manca un passo. Ho spostato questa domanda qui , così posso scrivere un esempio di codice.
Redsandro,

Forse in relazione, penso che ci sia un limite di tempo su quanto può durare lo script. Credo che sia molto breve (come 1 secondo o qualcosa del genere). Se impiega più tempo, udev lo ucciderà. Puoi aggirare questo problema usando lo sfondo dello script con qualcosa di simile at. Vedi "esecuzione di programmi esterni" su Reactivated.net/writing_udev_rules.html
cheshirekow,

Solo per aggiungere a questo, per completezza, il file deve avere il suffisso .rulese i file nella directory vengono letti in un ordine lessicale (la convenzione utilizza un prefisso numerico per ordinarli) e possono essere al di sotto /etc/, /usr/liboppure /run. Per di più, RTFM .
Starfry il

14

Ho cercato /lib/udev/rules.desempi di regole relative al disco. Su un sistema Ubuntu un file di regole fornisce la variabile di ambiente ID_FS_UUID_ENCche è possibile utilizzare nei propri file di regole.

Quindi ho messo un file di regole personalizzato sotto /etc/udev/rules.d/foodevice.rules. Poiché non è preceduto da un numero, viene finalmente eseguito da udev. A proposito, il demone udev ha osservato le /etc/udev/rules.dmodifiche in modo tale che non è necessario riavviarlo durante le modifiche ai file.

Il contenuto di /etc/udev/rules.d/foodevice.rulesè:

ACTION=="add", KERNEL=="sd*[!0-9]", ENV{ID_FS_UUID_ENC}=="FFFF-AAAF",
  RUN+="/usr/bin/sudo -u juser /home/juser/path/script.sh"

(questa è una regola: devi rimuovere la nuova riga dopo la clausola ENV perché udev non ha un meccanismo di continuazione della linea)

Un programma avviato da udev blocca il demone, quindi non dovrebbe funzionare a lungo. L'ho risolto tramite at- cioè tramite il distacco dal processo facendo il vero lavoro:

$ cat /home/juser/path/script.sh
#!/bin/sh
echo ~/path/mountcopystuff.sh | at now

1
Potrebbe essere necessario ricaricare le regole di udev utilizzando udevadm control --reload-rules, a seconda della distribuzione.
user44038

1
Invece di at nowsuggerire batch.
Ripristina Monica - M. Schröder il

Cosa fare quando non hai né atbatch? Sono in un ambiente incorporato con busybox .
natenho,

@natenho, puoi usare ~/path/mountcopystuff.sh &- atecc. ha il vantaggio di ricevere notifiche e-mail nel caso qualcosa vada storto - ma su un sistema embedded questo probabilmente non è di grande interesse.
maxschlepzig,
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.