Jak uruchomić niestandardowe skrypty na wtyczce urządzenia USB?

41

Jaka jest najnowocześniejsza metoda automatycznego wykonywania niestandardowych skryptów we wtyczce urządzenia USB w obecnych dystrybucjach systemu Linux, takich jak Debian / CentOS / Fedora?

Na przykład, jeśli chcesz automatycznie zamontować / skopiować niektóre pliki / odmontować urządzenie pamięci masowej USB na podstawie jego UUID (lub identyfikatora urządzenia itp.).

maxschlepzig
źródło

Odpowiedzi:

27

Umieść taką linię w pliku w /etc/udev/rules.d:

KERNEL=="sd*", ATTRS{vendor}=="Yoyodyne", ATTRS{model}=="XYZ42", ATTRS{serial}=="123465789", RUN+="/pathto/script"

Dodaj klauzulę, np. NAME="subdir/mydisk%n"Jeśli chcesz użyć niestandardowej ścieżki wprowadzania w obszarze /dev.

Uruchom, udevadm info -a -n sdbaby zobaczyć, z którymi atrybutami możesz dopasować ( attribute=="value"; zamień sdbna nazwę urządzenia automatycznie przypisaną do dysku, odpowiadającą nowemu wpisowi utworzonemu /devpo podłączeniu go). Należy pamiętać, że można korzystać z ATTRSklauzul z dowolnej jednej zwrotce: można wybrać dowolną zwrotka, ale ATTRSklauzule wszystkie muszą pochodzić z tej samej zwrotki, nie można łączyć ze sobą. Możesz łączyć ATTRSklauzule z innymi typami klauzul wymienionymi w innej zwrotce.

Gilles „SO- przestań być zły”
źródło
1
Czy ta odpowiedź jest nadal aktualna? Pod żadnym pozorem nie mogę zmusić skryptu do wykonania (i dotknięcia pliku). Jeśli możesz podać najbardziej podstawowy przykład wykonania skryptu po podłączeniu czegokolwiek , byłoby świetnie, a my możemy pracować od tego momentu .
Redsandro
@ Redsandro Mam odmiany tej reguły w mojej konfiguracji udev i działają. Czy podłączyłeś urządzenie i włączyłeś je ponownie, czy uruchomiłeś udevadm trigger? Czy twój system używa udev? Jeśli chcesz uruchomić skrypt, gdy coś jest podłączone, usuń wszystkie warunki (klauzule z ==) (być może składnia wymaga jednego warunku, nie jestem pewien; jeśli tak, użyj KERNEL=="*").
Gilles „SO- przestań być zły”
Też tego próbowałem, ale skoro to działa dla ciebie, muszę przegapić krok. Mam przeniesiony na to pytanie tutaj , więc mogę napisać przykładowy kod.
Redsandro
Być może powiązane, myślę, że istnieje limit czasu, przez jaki skrypt może działać. Uważam, że jest bardzo krótki (jak 1 sekunda czy coś takiego). Jeśli to potrwa dłużej, udev go zabije. Możesz obejść ten problem, używając skryptu w tle z czymś podobnym at. Zobacz „Uruchamianie programów zewnętrznych” na reaktywowanym.net/writing_udev_rules.html
cheshirekow
Aby dodać do tego, ze względu na kompletność, plik musi mieć sufiks, .rulesa pliki w katalogu są odczytywane w porządku leksykalnym (konwencja używa prefiksu numerycznego, aby je uporządkować), i mogą być poniżej /etc/, /usr/liblub /run. Aby uzyskać więcej, RTFM .
starfry
14

Szukałem /lib/udev/rules.dprzykładów reguł związanych z dyskami. W systemie Ubuntu jeden plik reguł zawiera zmienną środowiskową, ID_FS_UUID_ENCktórej można używać we własnych plikach reguł.

Dlatego umieściłem niestandardowy plik reguł /etc/udev/rules.d/foodevice.rules. Ponieważ nie jest poprzedzony liczbą, jest w końcu uruchamiany przez udev. Przy okazji demon udev obserwował /etc/udev/rules.dzmiany, tak że nie trzeba go ponownie uruchamiać przy zmianach plików.

Treść /etc/udev/rules.d/foodevice.rulesjest:

ACTION=="add", KERNEL=="sd*[!0-9]", ENV{ID_FS_UUID_ENC}=="FFFF-AAAF",
  RUN+="/usr/bin/sudo -u juser /home/juser/path/script.sh"

(jest to jedna zasada - musisz usunąć znak nowej linii po klauzuli ENV, ponieważ udev nie ma mechanizmu kontynuacji linii)

Program uruchamiany przez udev blokuje demona - dlatego nie powinien działać długo. Rozwiązałem to poprzez at- tj. Poprzez oderwanie się od procesu wykonującego prawdziwą pracę:

$ cat /home/juser/path/script.sh
#!/bin/sh
echo ~/path/mountcopystuff.sh | at now
maxschlepzig
źródło
1
Może być konieczne ponowne załadowanie reguł udev udevadm control --reload-rules, w zależności od dystrybucji.
user44038,
1
Zamiast at nowsugerować batch.
Przywróć Monikę - M. Schröder
Co robić, gdy nie masz atani batch? Jestem w środowisku osadzonym z busybox .
natenho
@natenho, możesz użyć ~/path/mountcopystuff.sh &- atitp. ma tę zaletę, że otrzymujesz powiadomienia e-mail na wypadek, gdyby coś poszło nie tak - ale w systemie wbudowanym prawdopodobnie nie jest to interesujące.
maxschlepzig