Utilizzo delle regole udev per eseguire uno script sull'inserimento USB


17

Sto cercando di impostare uno script da eseguire ogni volta che collego un dispositivo USB. Ho creato il file /etc/udev/rules.d/90-local.rules e ho aggiunto la seguente regola:

ACTION=="add", SUBSYSTEM=="usb", KERNEL=="sd*", SYSFS{model}=="Cruzer*", RUN+="sh /home/jesse/Documents/Scripts/cruzer.sh"

Il problema è che quando l'unità è collegata, non succede nulla. Lo script, a scopo di debug, è truccato per inviare una notifica con notifica-invio, che è installato e funziona bene dal terminale.

Il percorso dello script è corretto, poiché ho eseguito esattamente quel comando nel terminale senza problemi.


Il tuo antivirus è in esecuzione? Questo è un comportamento che innescerebbe l'azione da qualsiasi numero di programmi AV. Anche se mi aspetto un avviso, se hai disabilitato le notifiche, potresti non vederlo tranne nei registri. Consiglierei di disabilitare Internet, quindi il tuo programma AV, di riprovare.
zenbike,

Esecuzione di Ubuntu 11.04 senza AV installato.
JTeK,

@zenbike: Perché l'aggiunta di regole udev personalizzate innescherebbe un programma antivirus?
user1686

L'avvio di qualsiasi script all'inserimento del dispositivo può causare falsi positivi in ​​un set AV per la scansione di dispositivi rimovibili. Perché non lo so. Che mi sia successo con uno script installato in fabbrica su una chiavetta USB e Avira AV, lo so.
zenbike,

Risposte:


6

Ho avuto lo stesso problema. Questo ha funzionato per me:

Prova a copiare lo script in /usr/local/bine cambia la directory nel tuo .rulesfile.

Inoltre, non so cosa sia SYSFS, ma preferirei utilizzare le proprietà ATTR.

La seguente riga è il contenuto del mio .rulesfile:

ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd[a-z]1", ATTRS{vendor}=="SanDisk ", RUN+="/usr/local/bin/backup.sh"

la ATTRS{vendor}=="SanDisk "parte significa che Sandiskverrà rilevato solo?
blade19899,

7

notify-send richiede l'accesso al bus di sessione DBus, che non può avere per due motivi:

  • Nessuna informazione sulla sessione. Quando avviato da udev, il tuo script non sa nulla di dove sei connesso o se hai effettuato l'accesso. Il multi-seat con X11 è ancora complicato, ma il cambio utente funziona sia per X11 che per sessioni di console. Molte persone usano anche SSH, VNC e NX sulla rete.

    ( DISPLAY=:0funzionerebbe per metà del tempo, ma questo è ancora indovinare al meglio.)

  • Negato dalla politica di DBus. Anche se lo script trova in qualche modo la tua sessione X11, non sarà in grado di inviare notifiche a causa dell'esecuzione dello script come rootinvece del tuo account utente.


2
for LINE in $(find /proc/ -maxdepth 2 -name environ -exec grep -z "^DBUS_SESSION_BUS_ADDRESS" {} \; | sort -uz | tr '\0' '\n'); do eval $LINE ... done;ha fatto il trucco per me con notifica-invio
mlt

1

In alternativa, puoi provare a far corrispondere il dispositivo per fornitore e ID prodotto. La seguente regola personalizzata funziona per me:

ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="0763", ATTR{idProduct}=="019b", RUN+="/usr/bin/aconnect 20 128"

È possibile visualizzare idVendor e idProduct nell'output di lsusb o in dmesg dopo aver collegato il dispositivo.


L'ho provato e non ha funzionato neanche ... (ATTR {idProduct} == "5530") ... è richiesto anche il fornitore? Non la penso così ...
JTeK il

In tal caso, il problema potrebbe riguardare lo script stesso. Ad esempio, può dipendere dalla variabile env $ PATH. Per un test prova a eseguirlo come export PATH = ''; /home/jesse/Documents/Scripts/cruzer.sh
Aleh

1

Seguendo la risposta di Aleh: se vuoi anche monitorare gli removeeventi, devi cercare una variabile d'ambiente chiamata ID_SERIAL. Contiene il fornitore e l'ID del prodotto separati da un trattino basso:

ACTION=="add|remove", SUBSYSTEM=="usb", ENV{ID_SERIAL}=="0763_019b" RUN+="/usr/bin/aconnect 20 128"

Anche la regola è ora più breve.


0

Forse, potresti aver bisogno di aggiungere uno sleepall'interno dello script, per dare al dispositivo USB la possibilità di "sistemarsi"? Ad esempio, modem USB 3G, cambio di modalità per ottenere un / dev / ttyUSB per essere avviato e avviato dal kernel.


0

Prova a sostituire SUBSYSTEM = "usb" con SUBSYSTEMS = "usb"


No, SUBSYSTEM=="usb"va bene.
krlmlr,
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.