Korzystanie z reguł udev w celu uruchomienia skryptu podczas podłączania USB


17

Próbuję skonfigurować skrypt do uruchamiania za każdym razem, gdy podłączam urządzenie USB. Utworzyłem plik /etc/udev/rules.d/90-local.rules i dodałem następującą regułę:

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

Problem polega na tym, że gdy napęd jest podłączony, nic się nie dzieje. Skrypt do celów debugowania jest przygotowany do wysyłania powiadomień za pomocą powiadomienia-wysyłania, które jest zainstalowane i działa poprawnie z terminala.

Ścieżka do skryptu jest poprawna, ponieważ uruchomiłem dokładnie to polecenie w terminalu bez żadnych problemów.


Czy Twój program antywirusowy działa? Jest to zachowanie, które wyzwalałoby działanie z dowolnej liczby programów AV. Chociaż spodziewam się ostrzeżenia, jeśli wyłączyłeś powiadomienia, możesz ich nie zobaczyć, z wyjątkiem dzienników. Poleciłbym wyłączenie Internetu, a następnie programu AV, ponawianie prób.
zenbike

Uruchamianie Ubuntu 11.04 bez zainstalowanego AV.
JTeK

@zenbike: Dlaczego dodanie niestandardowych reguł udev wyzwala program antywirusowy?
user1686

Uruchomienie dowolnego skryptu podczas wstawiania urządzenia może spowodować fałszywe alarmy w zestawie AV do skanowania urządzeń wymiennych. Nie wiem. Wiem, że przydarzyło mi się to z fabrycznie zainstalowanym skryptem na pendrivie i Avira AV.
zenbike

Odpowiedzi:


6

Miałem ten sam problem. To działało dla mnie:

Spróbuj skopiować skrypt do /usr/local/binkatalogu i zmień katalog w swoim .rulespliku.

Nie wiem też, czym jest SYSFS, ale wolałbym używać właściwości ATTR.

Następująca linia to treść mojego .rulespliku:

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

ATTRS{vendor}=="SanDisk "część to znaczy, że tylko Sandiskbyć wykryty zostanie?
blade19899,

7

notify-send wymaga dostępu do magistrali sesji DBus, której nie może mieć z dwóch powodów:

  • Brak informacji o sesji. Po uruchomieniu przez udev, twój skrypt nie wie nic o tym, gdzie jesteś zalogowany lub czy w ogóle jesteś zalogowany. Wieloosobowa konfiguracja z X11 jest wciąż trudna, ale przełączanie użytkowników działa zarówno dla sesji X11, jak i sesji konsoli. Wiele osób korzysta także z SSH, VNC i NX przez sieć.

    ( DISPLAY=:0działałoby to przez połowę czasu, ale nadal w najlepszym razie zgadywanie ).

  • Odmowa przez zasady DBus. Nawet jeśli skrypt w jakiś sposób znajdzie sesję X11, nie będzie w stanie wysyłać powiadomień z powodu uruchomienia skryptu jako rootzamiast konta użytkownika.


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;wykonał dla mnie lewę, wysyłając powiadomienie
mlt

1

Zamiast tego możesz spróbować dopasować urządzenie według identyfikatora dostawcy i produktu. Następująca niestandardowa reguła działa dla mnie:

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

Możesz zobaczyć idVendor i idProduct w wyjściu lsusb lub dmesg po podłączeniu urządzenia.


Próbowałem tego i to też nie działało ... (ATTR {idProduct} == "5530") ... czy sprzedawca jest również wymagany? Nie pomyślałbym tak ...
JTeK

W takim przypadku problem może dotyczyć samego skryptu. Na przykład może zależeć od zmiennej env $ PATH. Dla testu spróbuj uruchomić go jak export PATH = ''; /home/jesse/Documents/Scripts/cruzer.sh
Aleh

1

W odpowiedzi na odpowiedź Aleha: Jeśli chcesz również monitorować removezdarzenia, musisz poszukać zmiennej środowiskowej o nazwie ID_SERIAL. Zawiera identyfikator dostawcy i produktu oddzielone podkreśleniem:

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

Reguła jest teraz również krótsza.


0

Być może konieczne może być dodanie sleepskryptu, aby dać urządzeniu USB szansę na „ustabilizowanie się”? Na przykład modemy USB 3g, przełączanie trybów w celu uzyskania / dev / ttyUSB w celu uruchomienia i uruchomienia przez jądro.


0

Spróbuj zamienić SUBSYSTEM = „usb” na SUBSYSTEMS = „usb”


Nie, SUBSYSTEM=="usb"jest w porządku.
krlmlr
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.