Як запустити власні сценарії на плагін 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 У моїй конфігурації udev є варіанти цього правила, і вони працюють. Ви підключили пристрій і повернули його назад чи запустили udevadm trigger? Чи використовує ваша система udev? Якщо ви хочете запустити сценарій, коли щось підключено, видаліть усі умови (пункти з ==) (можливо, синтаксис вимагає однієї умови, я не впевнений; якщо так, використовуйте KERNEL=="*").
Жил "ТАК - перестань бути злим"

Я теж спробував це, але оскільки це працює для вас, я, мабуть, не пропустив жодного кроку. Я перемістив це питання сюди , тому можу написати приклад коду.
Редсандро

Можливо, пов'язане, я думаю, що є обмеження в часі, скільки часу може працювати сценарій. Я вважаю, що це дуже коротко (наприклад, 1 секунда чи щось). Якщо це займе більше часу, то удев вб'є його. Ви можете обійти це, використовуючи фонове сценарій з чимось подібним at. Дивіться "Запуск зовнішніх програм" на reactivate.net/writing_udev_rules.html
cheshirekow

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

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? Я перебуваю у вбудованому середовищі із зайнятим ящиком .
natenho

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