Використання правил udev для запуску сценарію на вставці через USB


17

Я намагаюся налаштувати сценарій для запуску кожного разу, коли я підключаю USB-пристрій. Я створив файл /etc/udev/rules.d/90-local.rules і додав таке правило:

ACTION=="add", SUBSYSTEM=="usb", KERNEL=="sd*", SYSFS{model}=="Cruzer*", RUN+="sh /home/jesse/Documents/Scripts/cruzer.sh"

Проблема полягає в тому, що при підключенні накопичувача нічого не відбувається. Сценарій для цілей налагодження встановлюється для надсилання повідомлення з notify-send, яке встановлено та працює добре з терміналу.

Шлях до сценарію правильний, оскільки я виконав цю точну команду в терміналі без проблем.


Ваш антивірус працює? Це поведінка, яка може викликати дії з будь-якої кількості AV-програм. Хоча я очікую попередження, якщо ви відключили сповіщення, ви можете бачити його, окрім журналів. Я рекомендую вимкнути Інтернет, потім вашу AV-програму, спробувати її знову.
zenbike

Запуск Ubuntu 11.04 без встановлення AV.
JTeK

@zenbike: Чому додавання спеціальних правил udev викликає антивірусну програму?
користувач1686

Запуск будь-якого сценарію щодо вставки пристрою може спричинити помилкові позитиви в AV-наборі для сканування знімних пристроїв. Чому я не знаю. Що трапилося зі мною зі встановленим на заводі сценарієм на thumbdrive та Avira AV, я точно знаю.
zenbike

Відповіді:


6

У мене була така ж проблема. Це працювало для мене:

Спробуйте скопіювати свій скрипт /usr/local/binі змінити каталог у вашому .rulesфайлі.

Крім того, я не знаю, що таке SYSFS, але я вважаю за краще використовувати властивості ATTR.

Наступний рядок - це вміст мого .rulesфайлу:

ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd[a-z]1", ATTRS{vendor}=="SanDisk ", RUN+="/usr/local/bin/backup.sh"

ATTRS{vendor}=="SanDisk "частина це означає , що тільки Sandiskбуде виявлено?
blade19899

7

notify-send вимагає доступу до вашої шини сеансу DBus, який він не може мати з двох причин:

  • Інформації про сеанс немає. Починаючи з udev, ваш сценарій нічого не знає про те, де ви ввійшли або якщо ви взагалі увійшли. Багатомісні місця з X11 все ще складні, але комутація користувачів працює як для X11, так і для консольних сесій. Багато людей також використовують SSH, VNC та NX через мережу.

    ( DISPLAY=:0працював би половину часу, але це все ще здогадується в кращому випадку.)

  • Заперечується політикою DBus. Навіть якщо ваш скрипт якимось чином знайде ваш сеанс X11, він не зможе надсилати сповіщення через те, що сценарій запускається rootзамість вашого облікового запису користувача.


2
for LINE in $(find /proc/ -maxdepth 2 -name environ -exec grep -z "^DBUS_SESSION_BUS_ADDRESS" {} \; | sort -uz | tr '\0' '\n'); do eval $LINE ... done;зробив трюк для мене з notify-send
mlt

1

Ви можете спробувати співставити пристрій за ідентифікаторами продавця та продукту. Наступне спеціальне правило працює для мене:

ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="0763", ATTR{idProduct}=="019b", RUN+="/usr/bin/aconnect 20 128"

Ви можете побачити idVendor та idProduct у виході lsusb або dmesg після приєднання пристрою.


Я спробував це, і це не спрацювало ... (ATTR {idProduct} == "5530") ... чи потрібен також постачальник? Я б не думав так ...
JTeK

У такому випадку проблема може бути з самим сценарієм. Наприклад, це може залежати від змінної $ PATH env. Для тесту спробуйте запустити його як export PATH = ''; /home/jesse/Documents/Scripts/cruzer.sh
Aleh

1

Слідкуйте за відповіддю Алега: Якщо ви також хочете відстежувати removeподії, вам потрібно шукати змінну середовища з назвою ID_SERIAL. Він містить ідентифікатора продавця та продукту, розділених підкресленням:

ACTION=="add|remove", SUBSYSTEM=="usb", ENV{ID_SERIAL}=="0763_019b" RUN+="/usr/bin/aconnect 20 128"

Зараз правило теж коротше.


0

Можливо, вам може знадобитися додати sleepсценарій в межах сценарію, щоб дати можливість пристрою usb «осісти»? Наприклад, usb 3g модеми, перемикання режимів для отримання / dev / ttyUSB, щоб ядро ​​запускалось і працює ядром.


0

Спробуйте замінити SUBSYSTEM = "usb" на SUBSYSTEMS = "usb"


Ні, SUBSYSTEM=="usb"це просто добре.
krlmlr
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.