Jak uruchomić skrypt, gdy zamontowany jest określony dysk flash?

46

Czy istnieje sposób uruchomienia skryptu po podłączeniu określonego urządzenia USB?

Trzymam moje filmy na osobnym USB i chciałbym uruchomić skrypt, który zamontowałby folder wideo na urządzeniu USB do folderu w folderze domowym.

Braiam
źródło

Odpowiedzi:

31

Teraz systemd oferuje o wiele ładniejsze rozwiązanie . Tworzysz usługę zależną i pożądaną przez Ciebie media, np .:/etc/systemd/system/your.service

[Unit]
Description=My flashdrive script trigger
Requires=media-YourMediaLabel.mount
After=media-YourMediaLabel.mount

[Service]
ExecStart=/home/you/bin/triggerScript.sh

[Install]
WantedBy=media-YourMediaLabel.mount

Następnie musisz uruchomić / włączyć usługę:
sudo systemctl start your.service
sudo systemctl enable your.service

Po zamontowaniu systemd uruchamia skrypt wyzwalacza. Przewagą nad regułą udev jest to, że skrypt naprawdę uruchamia się po zamontowaniu, a nie po dodaniu urządzenia systemowego.

Przypadek użycia : mam zaszyfrowaną partycję, którą chcę automatycznie wykonać kopię zapasową. Po dodaniu urządzenia muszę wpisać hasło. Jeśli podłączyłem skrypt kopii zapasowej do udev, skrypt próbuje uruchomić się w momencie, gdy wpisuję hasło, co się nie powiedzie.

Zasób: Skrypty z udev

Uwaga: Możesz znaleźć swoje urządzenie z:systemctl list-units -t mount

sumid
źródło
Mam nadzieję, że kwiecień 2016 r. Już wkrótce. Kolejne Ubuntu LTS będzie mieć włączone system. AFAIK fajne rozwiązanie z powyższego wymaga Ubuntu 15.04 lub nowszego.
guettli,
Och, myślałem, że systemd jest już w Ubuntu. Właściwie prowadzę debian stretch ;-)
sumid
@ sumid Jeśli chcę umieścić go w ~ / .config / systemd, czy to zadziała?
Khurshid Alam
4
Wspaniały! Testowane w Debian Jessie. Nie zapomnij włączyć usługi systemctl enable your.service. Plik skryptu musi być wykonywalny.
Corni,
1
Dla mnie to się nie udaje. Gdy próbuję uruchomić usługę, narzeka ona na komunikat „Nie znaleziono jednostki media-bb.mount.”. Nazywałem FS mojego pendrive'a (FAT32) „bb”, aby upewnić się, że nie ma w nim dziwnych znaków i że nie jest on zbyt długi ani nic takiego. Próbowałem Requires=, After=i WantedBy=linie zarówno z media-bb.mounti media-BB.mountdlatego Nautilus pokazuje mi objętości jako „BB”, a nie „BB”. Ten sam komunikat o błędzie, z wyjątkiem wielkich liter. Co jest nie tak? Czy muszę jakoś stworzyć tę media-<something>.mountusługę?
UTF-8
29

Zacznij od znalezienia swojego urządzenia w lsusb. Zanotuj identyfikator (np. 0a81:0101)

Utwórz nowy plik reguł udev w /etc/udev/rules.d/via sudoedit /etc/udev/rules.d/100-mount-videos.rulesi umieść tam nową regułę w następujący sposób:

ACTION=="add", ATTRS{idVendor}=="0a81", ATTRS{idProduct}=="0101", RUN+="/home/your_username/bin/mount_videos.sh"

Zwróć uwagę, jak użyłem identyfikatora z lsusb.

Następnie wystarczy napisać skrypt, aby wykonać pracę. Proste polecenie montowania powinno działać. Możesz potrzebować tam sleep 5komendy, aby poczekać na zainicjowanie systemu plików (jeśli zostawisz gnome, aby wykonać główne montowanie - ale możesz go najpierw zainstalować, a potem możesz nie potrzebować snu).

Dodatek od Allana: długo działające skrypty mogą blokować „wszystkie dalsze zdarzenia dla tego lub zależnego urządzenia”. Moja strona podręcznika Mint stwierdza ponadto: „Długoterminowe zadania należy natychmiast odłączyć od samego procesu zdarzenia”. Nie podaje się wskazówek, gdzie zdobyć umiejętności, aby to zrobić.

Odpowiedź od Oli: Zawiń to tak: https://askubuntu.com/a/106359/449

Oli
źródło
4
Mogę zasugerować, aby poprzedzić komendę „RUN” słowem „su twój_użytkownik -c”, aby skrypt nie działał z uprawnieniami administratora.
Kees Cook
3
@Kees Ponieważ celem jest tutaj wzrost, utrzymanie roota może być dobrym pomysłem. Być może zamiast trzymać skrypt w domu użytkownika, trzymasz go w /root/miejscu, gdzie tylko root może go edytować.
Oli
2
To nie odpowiada na pytanie. Pytanie pyta jak uruchomić skrypt, gdy dysk USB jest zamontowany . Ta odpowiedź mówi, jak wykonać skrypt, który podłącza dysk USB po jego włożeniu . Różnica ma dla mnie znaczenie, ponieważ mam taki skrypt (do aparatu cyfrowego); bez skryptu dysk może lub może zostać zamontowany podczas wstawiania (w zależności od ustawień użytkownika) i tylko wtedy, gdy dysk jest zamontowany, chcę coś zrobić (skopiować obrazy). Więc mój skrypt (który działa po dodaniu napędu) często działa w niewłaściwym czasie.
Reinier Post
jest to niezwykle konkretny (kruchy) sposób na osiągnięcie. @sumid odpowiedź bardziej dotyczy współczesnych dystrybucji korzystających z systemd
MrMesees
8

Innym sposobem uzyskania wartości ATTRS {idVendor} i ATTRS {idProduct} (testowany w Ubuntu 12.04) jest:

  1. Znajdź, gdzie zamontowany jest twój usb:

    $ mount | grep /dev/sd*
    

    pokazuje to coś takiego:

    /dev/sdb on /media/SOMEDIR type vfat ...
    
  2. Użyj udevadm, aby uzyskać informacje o tym urządzeniu:

    udevadm info -q all -n /dev/sdb | grep -E -i -w '.*VENDOR_ID.*|.*MODEL_ID.*'
    

    wynik powinien być podobny do:

    E: ID_MODEL_ID=001a
    E: ID_VENDOR_ID=002b
    
  3. Teraz użyj identyfikatora modelu dla ATTRS {idProduct} i identyfikatora dostawcy dla ATTRS {idVendor}

    ACTION=="add", ATTRS{idVendor}=="002b", ATTRS{idProduct}=="001a" ...
    
emont01
źródło
1

W Nautilus w Edycja> Preferencje> Media możesz wybrać „inną akcję” niż „komendę kostiumową”. do wykonania różnego rodzaju mediów. Do tego czasu dysk USB jest już zamontowany, ale przypuszczam, że nadal możesz go połączyć (za pomocą komendy costum) z folderem, w którym dysk ma się pojawiać. Nie wiedziałem, czy jest to łatwiejsze, czy lepsze niż używanie udev.

boczek
źródło
czy polecenie nosi kostium? czy kostium?
erjoalgo
1

Jeśli nie chcesz zakłócać kontroli nad menedżerem plików (nautilus, konquerer, gnome itp.) Nad montowaniem i odmontowywaniem urządzenia, sugeruję, aby nie iść drogą udev.

Zamiast tego użyj udisks-glue, jeśli twój system używa udisk (prawie wszyscy tak robią).

Po instalacji po prostu utwórz plik konfiguracyjny ~/.udisks-glue.confw swoim katalogu domowym w ten sposób.

Mój poniższy przykład aktualizuje dane GPS-Assist w moim aparacie za każdym razem, gdy podłączam kartę SD.

filter BT16EXTREME {
  optical = false
  partition_table = false
  usage = filesystem
  label = BT16EXTREME
}
match BT16EXTREME {
  post_mount_command = "/home/bernhard/update-gps-assist-data.pl %mount_point"
}

Następnie upewnij się, że udisks-glue uruchamia się podczas uruchamiania lub logowania. Tj. Za pomocą aplikacji startowych gnome

xro
źródło
1
Nie obsługuje udev2 :-(
sumid 25.0915
0

Odpowiedź @ sumid ma problem. Należy nie uruchomić usługę. Musisz go tylko włączyć.

plik: /etc/systemd/system/your.service

[Unit]
Description=My flashdrive script trigger
Requires=media-YourMediaLabel.mount
After=media-YourMediaLabel.mount

[Service]
ExecStart=/any_path_even_inside_the_mount_point/script.sh

[Install]
WantedBy=media-YourMediaLabel.mount

Następnie włącz usługę:

sudo systemctl enable your.service

To wszystko.

Uwaga: etykietę medialną możesz znaleźć za pomocą:sudo systemctl list-units -t mount

Uwaga 2: Jeśli usługa jakoś się nie powiedzie (na przykład skrypt nie jest wykonywalny), punkt podłączenia zmieni się na <old_mount_point_name>1następnym razem, gdy podłączasz urządzenie USB. Aby rozwiązać ten problem, wystarczy wykonaćsudo systemctl reset-failed

sgon00
źródło