Uso delle regole di udev per eseguire uno script sull'inserzione USB

Sto cercando di impostare uno script da eseguire each volta che inserisco 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 niente. Lo script, per scopi di debug, è strutturato per submit una notifica con notify-send, che viene installato e funziona bene dal terminal.

Il path dello script è corretto, poiché ho eseguito quel command esatto nel terminal senza problemi.

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

Provare a copiare il tuo script in /usr/local/bin e cambiare la directory nel file .rules .

Inoltre, non so cosa sia SYSFS, ma preferirei utilizzare le properties; ATTR.

La row seguente è il contenuto del mio file .rules :

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

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

  • Nessuna informazione sulla session. Quando avviato da udev, il tuo script non sa nulla di where sei connesso o se sei loggato. La seduta multipla con X11 è ancora difficile, ma la commutazione dell'utente funziona sia per le sessioni X11 che per la console. Molte persone utilizzano anche SSH, VNC e NX attraverso la networking.

    ( DISPLAY=:0 functionrebbe la metà del tempo, ma questo è ancora meglio.)

  • Negato dalla politica di DBus. Anche se lo script in qualche modo trova la tua session X11, non sarà in grado di submit notifiche a causa dello script che viene eseguito come root anziché all'account utente.

Puoi provare a abbinare il dispositivo agli ID vendor e ai prodotti. La seguente regola personalizzata funziona per me:

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

È ansible vedere idVendor e idProduct nell'output lsusb o dmesg dopo aver collegato il dispositivo.

Seguire la risposta di Aleh: se vuoi anche monitorare gli events di remove , devi cercare una variabile d'ambiente denominata ID_SERIAL . Contiene ID fornitore e prodotto separato da sottolineatura:

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

La regola è ora più corta.

Forse, potrebbe essere necessario aggiungere un sleep all'interno dello script, per dare alla periferica usb una possibilità di "sistemare" verso il basso? Ad esempio, modem usb 3g, modalità di commutazione per get un / dev / ttyUSB per get kicked ed eseguire dal kernel.

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