Как запустить скрипт при установке определенного флеш-накопителя?

42

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

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

    
задан Braiam 06.02.2011 в 22:00
источник

7 ответов

28

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

Создайте новый файл правил udev в /etc/udev/rules.d/ через 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 для основного монтирования, но вы можете сначала установить ее, а затем вам может не понадобиться спать).

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

Ответ от Oli: Оберните его так: Ссылка

    
ответ дан Oli 07.02.2011 в 00:54
21

Теперь гораздо более приятное решение с 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

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

    
ответ дан sumid 29.09.2015 в 10:51
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" ...
    
ответ дан emont01 19.09.2012 в 01:11
1

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

ответ дан bacon 06.02.2011 в 23:53
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-клей запускается при загрузке или входе в систему. То есть через приложения запуска gnome

    
ответ дан xro 24.11.2014 в 04:10
0

использовать udev

Ссылка

    
ответ дан user10333 06.02.2011 в 22:11
0

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

file: /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

    
ответ дан sgon00 11.12.2017 в 11:57