Как запустить пользовательские сценарии на подключаемом USB-устройстве?


41

Каков современный метод автоматического выполнения пользовательских сценариев на подключаемом модуле USB-устройства в современных дистрибутивах Linux, таких как Debian / CentOS / Fedora?

Например, если вы хотите автоматически смонтировать / скопировать некоторые файлы / размонтировать запоминающее устройство USB на основе его UUID (или идентификатора устройства и т. Д.).

Ответы:


27

Поместите такую ​​строку в файл в /etc/udev/rules.d:

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

Добавьте предложение, например, NAME="subdir/mydisk%n"если вы хотите использовать пользовательский путь ввода в /dev.

Запустите, udevadm info -a -n sdbчтобы увидеть, с какими атрибутами вы можете сопоставить ( attribute=="value"; замените sdbна имя устройства, автоматически назначаемое диску, соответствующее новой записи, созданной /devпри его подключении). Обратите внимание , что вы можете использовать ATTRSпункты из любой одной строфы: вы можете выбрать любую строфу, но ATTRSпункты должны все из той же строфы, вы не можете смешивать и сочетать. Вы можете смешивать ATTRSпредложения с другими типами предложений, перечисленных в другом разделе.


1
Этот ответ остается в силе? Ни при каких обстоятельствах я не могу заставить скрипт выполнить (и коснуться файла). Если вы можете предоставить самый простой пример, который выполняет скрипт, когда что-то подключено, это было бы здорово, и мы можем работать оттуда.
Redsandro

@Redsandro У меня есть варианты этого правила в моей конфигурации udev, и они работают. Вы подключили устройство и снова включили или запустили udevadm trigger? Ваша система использует udev? Если вы хотите запустить скрипт, когда что-то подключено, удалите все условия (пункты с ==) (возможно, синтаксис требует одно условие, я не уверен; если это так, используйте KERNEL=="*").
Жиль "ТАК - прекрати быть злым"

Я тоже это пробовал, но так как это работает для вас, я, должно быть, пропускаю шаг. Я перенес этот вопрос сюда , чтобы я мог написать пример кода.
Redsandro

Возможно, связано, я думаю, есть ограничение по времени, сколько может длиться скрипт. Я считаю, что это очень короткий (например, 1 секунда или что-то). Если это займет больше времени, то Udev убьет его. Вы можете обойти это, используя фоновый сценарий с чем-то вроде at. См. «Запуск внешних программ» на веб-сайте
activactive.net/writing_udev_rules.html

Просто добавить к этому, для полноты картины , потребность файла , чтобы иметь суффикс .rulesи файлы в каталоге считываются в лексикографическом порядке (Конвенция использует числовой префикс для того их), и они могут быть ниже /etc/, /usr/libили /run. Для более RTFM .
Звездный путь

14

Я искал /lib/udev/rules.dпримеры связанных с диском правил. В системе Ubuntu один файл правил предоставляет переменную среды, ID_FS_UUID_ENCкоторую вы можете использовать в собственных файлах правил.

Таким образом, я поместил файл пользовательских правил в /etc/udev/rules.d/foodevice.rules. Поскольку перед номером нет префикса, он наконец запускается udev. Кстати, демон udev следил /etc/udev/rules.dза изменениями, так что вам не нужно перезапускать его при изменении файла.

Содержание /etc/udev/rules.d/foodevice.rulesэто:

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

(это одно правило - вы должны удалить символ новой строки после предложения ENV, потому что у udev нет механизма продолжения строки)

Программа, запущенная udev, блокирует демона, поэтому она не должна работать долгое время. Я решил это через at- то есть путем отсоединения от процесса, выполняющего реальную работу:

$ cat /home/juser/path/script.sh
#!/bin/sh
echo ~/path/mountcopystuff.sh | at now

1
Вам может потребоваться перезагрузить правила udev udevadm control --reload-rules, в зависимости от вашего дистрибутива.
user44038

1
Вместо того, чтобы at nowя предлагаю batch.
Восстановить Монику - М. Шредер

Что делать, когда у тебя нет ни того, atни другого batch? Я нахожусь во встроенной среде с busybox .
natenho

@natenho, вы можете использовать ~/path/mountcopystuff.sh &- atи т.д. имеет то преимущество, что вы получаете уведомления по электронной почте на случай, если что-то пойдет не так, - но во встроенной системе это, вероятно, не представляет большого интереса.
maxschlepzig
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.