Как запустить скрипт при монтировании конкретной флешки?


46

Есть ли способ запустить скрипт при подключении определенного USB-устройства?

Я храню свои видео на отдельном USB и хотел бы запустить скрипт, который бы монтировал папку видео на устройстве USB в папку в домашней папке.

Ответы:


31

Теперь с systemd гораздо более приятное решение . Вы создаете сервис, который зависит от ваших медиа, например:/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

Затем вам нужно запустить / включить сервис:
sudo systemctl start your.service
sudo systemctl enable your.service

После монтирования systemd запускает ваш триггерный скрипт. Преимущество перед правилом udev заключается в том, что скрипт действительно запускается после монтирования, а не после добавления системного устройства.

Вариант использования : у меня есть зашифрованный раздел, который я хочу сделать резервную копию автоматически. После добавления устройства я должен ввести пароль. Если я подключил скрипт резервного копирования к udev, он попытается запустить его в тот момент, когда я набираю пароль, что не удастся.

Ресурс: Сценарии с Udev

Примечание. Устройство можно найти с помощью:systemctl list-units -t mount


Надеюсь, апрель 2016 скоро наступит. На следующем Ubuntu LTS будет включен systemd. AFAIK хорошее решение сверху нуждается в Ubuntu 15.04 или новее.
Геттли

О, я думал, что systemd уже есть в Ubuntu. Я на самом деле использую Debian Stretch ;-)
15:00

@sumid Если я захочу поместить его в ~ / .config / systemd, он будет работать?
Хуршид Алам

4
Большой! Проверено в Debian Джесси. Не забудьте включить свой сервис systemctl enable your.service. Файл сценария должен быть исполняемым.
Корни

1
Для меня это не удается. Когда я пытаюсь запустить службу, она выдает сообщение «Unit media-bb.mount not found.». Я назвал FS (FAT32) FS своего большого диска «bb», чтобы убедиться, что в нем нет странных символов, и он не слишком длинный или что-то в этом роде. Я попробовал Requires=, After=и WantedBy=линии как с media-bb.mountи media-BB.mountпотому Nautilus показывает мне объем , как «BB», а не «бб». То же сообщение об ошибке, за исключением заглавных букв. В чем дело? Должен ли я как-то создать этот media-<something>.mountсервис?
UTF-8

29

Начните с поиска вашего устройства в lsusb. Запишите идентификатор (например 0a81:0101)

Создайте новый файл правил udev в /etc/udev/rules.d/via sudoedit /etc/udev/rules.d/100-mount-videos.rulesи добавьте туда новое правило следующим образом:

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

Обратите внимание, как я использовал идентификатор из lsusb.

Тогда вам просто нужно написать скрипт, чтобы сделать работу. Простая команда монтирования должна работать. Вам может понадобиться sleep 5команда, чтобы дождаться инициализации файловой системы (если вы оставите gnome для основного монтирования - но вы можете сначала смонтировать его, а затем вам может не понадобиться сон).

Дополнение от Аллана: Долгосрочные сценарии могут блокировать «все дальнейшие события для этого или зависимого устройства». Моя страница руководства Mint также утверждает: «Долгосрочные задачи должны быть немедленно отсоединены от самого процесса события». Нет подсказок о том, где можно приобрести навык для этого.

Ответ от Оли: Оберните это так: https://askubuntu.com/a/106359/449


4
Я мог бы предложить префикс команды «RUN» с «su your_user -c», чтобы скрипт не работал с привилегиями root.
Кис Кук

3
@Kees Так как цель здесь нарастает, хорошей идеей может быть сохранение корневых привилегий. Возможно, вместо того, чтобы хранить скрипт в доме пользователя, вы оставляете его там /root/или где-нибудь, где только root может редактировать его.
Оли

2
Это не отвечает на вопрос. Вопрос спрашивает , как запустить сценарий , когда диск USB будет установлен . В этом ответе говорится, как выполнить скрипт, который монтирует USB-накопитель, когда он вставлен . Разница имеет значение для меня, потому что у меня есть такой сценарий (для цифровой камеры); без сценария диск может быть или может быть смонтирован при вставке (в зависимости от пользовательских настроек), и только когда диск смонтирован, я хочу что-то сделать (скопировать образы). Поэтому мой сценарий (который запускается при добавлении диска) часто выполняется не в то время.
Reinier Post


это невероятно специфический (хрупкий) способ достижения. Ответ @sumid более применим к современным дистрибутивам, использующим systemd
MrMesees

8

Другой способ получить значения для ATTRS {idVendor} и ATTRS {idProduct} (протестировано в Ubuntu 12.04):

  1. Найдите, где установлен ваш usb:

    $ mount | grep /dev/sd*
    

    это показывает что-то вроде следующего:

    /dev/sdb on /media/SOMEDIR type vfat ...
    
  2. Используйте udevadm, чтобы получить информацию об этом устройстве:

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

    вывод должен быть что-то вроде:

    E: ID_MODEL_ID=001a
    E: ID_VENDOR_ID=002b
    
  3. Теперь используйте идентификатор модели для ATTRS {idProduct} и идентификатор поставщика для ATTRS {idVendor}

    ACTION=="add", ATTRS{idVendor}=="002b", ATTRS{idProduct}=="001a" ...
    

1

В Nautilus под Edit> Preferences> Media вы можете выбрать «другое действие», а не «costum command». для различных видов носителей, которые будут выполнены. К тому времени USB-накопитель уже смонтирован, но я полагаю, что вы все равно можете связать его (с помощью команды costum) с папкой, в которой вы хотите, чтобы накопитель появился. Я не мог сказать, проще ли это или лучше, чем использовать udev.


Команда носит костюм? или костюм?
erjoalgo

1

Если вы не хотите вмешиваться в контроль вашего файлового менеджера (nautilus, konquerer, gnome и т. Д.) За монтированием и размонтированием вашего устройства, я советую не идти по пути udev.

Вместо этого используйте udisks-glue, если ваша система использует udisks (почти все так делают).

После установки просто создайте файл конфигурации ~/.udisks-glue.confв вашем домашнем каталоге, как это.

Мой следующий пример обновляет данные GPS-Assist на моей камере каждый раз, когда я подключаю 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"
}

После этого убедитесь, что udisks-glue запускается при загрузке или входе в систему. Т.е. через приложения запуска gnome


1
Не поддерживает udev2 :-(
пятницу,


0

Ответ @ Sumid имеет проблему. Вы не должны запускать службу. Вам просто нужно включить его.

файл: /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

Затем включите услугу:

sudo systemctl enable your.service

Вот и все.

Примечание: вы можете найти свой медиальный ярлык с:sudo systemctl list-units -t mount

Примечание 2: Если служба каким-либо образом перестала работать (например, скрипт не является исполняемым), ваша точка монтирования изменится на <old_mount_point_name>1следующий раз, когда вы подключите USB-устройство. Чтобы решить эту проблему, вам просто нужно выполнитьsudo systemctl reset-failed

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.