Jak uruchomić skrypt powłoki po wykryciu nowego urządzenia pamięci USB?

17

Chcę skryptu, który zrzuca dziennik i zaczyna się logować, gdy tylko pamięć masowa USB zostanie podłączona (z plikiem „OKdump” na nim). A jeśli wykryje coś nienormalnego (jak wizualnie błąd), chcę aby zrobić zrzut ekranu i zapisać go na tym samym dysku.

Amith KK
źródło

Odpowiedzi:

13

Użyj Udev. Udev jest demonem menedżera urządzeń. Między innymi odpowiada za nazewnictwo urządzeń. Możesz zdefiniować udev-rules, umieszczając pliki o określonej składni w katalogu reguł. Reguły mogą robić wiele rzeczy - w szczególności mogą uruchamiać skrypty, gdy określone urządzenie jest podłączone.

Jak rozwiązać problem:

Najpierw musisz zebrać informacje na swoim urządzeniu. Powiedzmy, że to połączyłeś i wiesz, że to pod nazwą /dev/sdb1. Jeśli tak, uruchom:

udevadm info -a -p $(udevadm info -q path -n /dev/sdb1)

Polecenie wyświetli informacje o twoim urządzeniu. To dość długie. Musisz znaleźć coś, co jednoznacznie identyfikuje urządzenie. Może to być numer seryjny ATTRS{serial}=="UA04FLGC"lub kombinacja innych atrybutów, takich jak ATTRS{idVendor}i ATTRS{idProduct}. Większość nazwisk jest mniej lub bardziej oczywista. Wybierz jedną lub kombinację kilku, które wydają się rozsądne - jeśli nie działają, spróbuj czegoś innego.

Po znalezieniu unikalnego identyfikatora utwórz plik, /etc/udev/rules.dktóry zaczyna się od dwóch cyfr i kończy na .rules. Dwie cyfry określają kolejność przetwarzania tych plików .rules - 70-usb-log-custom.rulespowinien być dla Ciebie dobrym wyborem. Składnia tego pliku reguł może być bardzo złożona. Jeśli jesteś zainteresowany, Google Udev. Jeśli nie tylko otwórz nowo utworzony plik i edytuj go, aby wyglądał mniej więcej tak:

# /etc/udev/rules.d/70-usb-log-custom.rules

KERNEL=="sd?1", ATTRS{serial}=="UA04FLGC", ACTION=="add", SYMLINK+="cusb1", RUN+="/home/confus/bin/usb-encrypt.sh add %k"
ENV{ID_FS_USAGE}=="crypto", ACTION=="remove", RUN+="/home/confus/bin/usb-encrypt.sh remove %k"
SUBSYSTEM=="usb", SYSFS{idVendor}=="1781", SYSFS{idProduct}=="0c9f", GROUP="users", MODE="0666"

To jest rzeczywisty plik udev, którego używam. Zawiera trzy zasady. Każda linia jest własną zasadą. Pierwszy wiersz uruchamia skrypt, aby utworzyć odszyfrowane urządzenie za każdym razem, gdy podłączony jest zaszyfrowany dysk. Drugi wiersz wywołuje ten sam skrypt z różnymi opcjami w przypadku usunięcia odszyfrowanego urządzenia. Trzeci wiersz określa uprawnienia dla innego powiązanego urządzenia.

Najprawdopodobniej będziesz potrzebować tylko pierwszej linii. Usuń resztę i wstaw odpowiedni numer seryjny (lub zestaw parametrów wybranych do identyfikacji urządzenia).

Objaśnienie mojego pliku:

KERNEL=="sd?1"mówi urządzenie szukamy w tej reguły nazywa się wzdłuż linii /dev/sda1, /dev/sdc1lub coś podobnego. Znak zapytania jest symbolem wieloznacznym każdego listu. ATTRS{serial}=="UA04FLGC"jest tutaj unikalnym identyfikatorem. W przypadku drugiego urządzenia, o którym mówiłem (trzecia linia), nie używam numeru seryjnego, ale kombinację SYSFS{idVendor}=="1781"i SYSFS{idProduct}=="0c9f"do jego identyfikacji.

ACTION=="add"określa regułę, że powinna działać tylko po dodaniu urządzenia; nie kiedy zostanie usunięty.

SYMLINK+="cusb1"Tworzy dowiązania do dysku, więc będzie go znaleźć pod jeden /dev/cusb1.

RUN+="/home/confus/bin/usb-encrypt.sh add %k" uruchamia skrypt i przekazuje do niego „add” i „% k” (nazwa urządzenia).

Nie podam więcej szczegółów, ponieważ istnieją doskonałe samouczki na temat reguł udev. To, co tu czytasz, powinno wystarczyć, aby się gapić.

dezorientować
źródło
Doskonała odpowiedź, ale teraz chcę skrypt, który rejestruje
Amith KK,
4
Wtedy będziesz musiał to napisać lub sprecyzować, czego dokładnie chcesz. Np. Nie widzę, co powiedziałby zrzut ekranu. Poza tym „zrzuca dziennik systemu”, dokąd? „Wszystko nienormalne” jest również dość szerokim pojęciem. Nie jesteśmy twoją osobistą armią - jeśli wiesz coś o skryptach bash, teraz masz wszystkie narzędzia potrzebne do samodzielnego napisania skryptu.
con-f-use
: D przepraszam @ con-f-use
Amith KK