Autorun skryptu po podłączeniu lub odłączeniu urządzenia USB

22

Co mogę zrobić, aby automatycznie uruchomić skrypt po zamontowaniu / podłączeniu lub odmontowaniu / odłączeniu urządzenia USB?

Radu Rădeanu
źródło
2
@XxxXxx: nie jest opcją, dopóki Cuttlefish nie ma wersji dla Ubuntu 12.10
Radu Rădeanu
2
możliwy duplikat: askubuntu.com/questions/25071/…
Glutanimate
@ Glutanimate: to pytanie dotyczy konkretnego dysku flash USB, ale ogólnie pytałem o urządzenie USB
Radu Rădeanu
@ Glutanimate: powiedzmy, że odpowiedzi na to pytanie są pomocne, w każdym razie nie odpowiada, jak automatycznie uruchomić skrypt po odłączeniu urządzenia USB.
Radu Rădeanu
1
„powiedzmy, że odpowiedzi na to pytanie są pomocne, w każdym razie nie odpowiada, jak automatycznie uruchomić skrypt po odłączeniu urządzenia USB”. Zgaduję, że jeśli zmienisz „ACTION = 'dodaj'” na „ACTION = „usuń” ”, to byłby dobry początek.
blujay

Odpowiedzi:

17

Dzięki MinimusHeximus i odpowiednim współautorom wątku, o którym wspomniał w swoim komentarzu do mojego podobnego pytania, myślę, że mogę teraz zaoferować następującą odpowiedź.

Będziesz potrzebować 5 (pięciu) plików dla takiego urządzenia USB w następujący sposób, po prostu wypełniając odpowiednie wartości <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>

Uwagi:

  1. Można uchwycić wartości <yourvendorid>i <yourproductid>wprowadzając komendę lsusbw Terminalu - gdy urządzenie USB jest podłączone - co pokaże wszystkie urządzenia USB aktualnie dostępne, jak Bus 003 Device 002: ID 8087:07da Intel Corp., gdzie 8087 jest VendorID i 07da jest ProductID .
  2. I <yourdevice>może to być dowolna dowolna nazwa, którą możesz wybrać dla swojego urządzenia USB, na przykład zdecydowałem się używać nazwy ogólnej „ klawiatura ” podczas tworzenia takich plików dla mojej klawiatury USB, która wymagała zastosowania innego układu klawiatury, gdy jest ona podłączona.
  3. W niektórych scenariuszach może nie być konieczne użycie ACTION=="remove"wiersza w pliku reguł udev, a tym samym powiązanych outplików 2 („)” , gdy nie trzeba nic robić (np. Cofnąć zmianę dokonaną, gdy urządzenie jest podłączony) po odłączeniu urządzenia.
Sadi
źródło
Z mojej nowej perspektywy wygląda to źle. Czy te klauzule nie muszą być na tej samej linii?
nafg
1
Działa to: ACTION == "add", ATTRS {idVendor} == "...", ATTRS {idProduct} == "...", ENV {XAUTHORITY} = "/ home / <user> /.Xauthority" , ENV {DISPLAY} = ": 0", RUN + = "<script>"
nafg
@nafg: z mojego początkującego punktu widzenia nie powinno mieć znaczenia, czy umieścisz je wszystkie w jednym wierszu (używając przecinka jako separatora) w pliku reguł udev, ale widzę, że dodałeś parametry XAUTHORITY i DISPLAY do reguł udev, które może działać dla ciebie lub kogoś innego, w takim przypadku zastanawiam się, czy nie są już potrzebne w dwóch plikach skryptu poniżej.
Sadi,
1
tak, o to chodzi, nie potrzebujesz już skryptu pośredniego (z wyjątkiem być może umieszczenia rzeczywistego skryptu w tle), ponieważ udev pozwala ci ustawić środowisko. Z mojego dokumentu udev rozumiem również, że każda linia jest niezależną regułą, wiersze w pliku nie są łączone.
nafg
@nafg: Dziękujemy za cenny wkład. Przeniosłem te środowiska, aby rządziły udev i to też działało dla mnie. Ponadto przeniosłem skrypty do / usr / local / bin, ponieważ zacząłem napotykać problemy po przeniesieniu folderu / home na osobną partycję (prawdopodobnie dlatego, że nie został wcześniej zamontowany). Wygląda na to, że używanie podziałów linii w regułach udev nie stwarza żadnych problemów, przynajmniej w moim systemie (Ubuntu 13.04 64-bitowy) i wolałem to dla czytelności.
Sadi