Использование правил 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"

Проблема в том, что когда диск подключен, ничего не происходит. Сценарий, для целей отладки, настроен на отправку уведомления с уведомлением-отправкой, которое установлено и отлично работает с терминала.

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


Ваш антивирус работает? Это поведение, которое запускает действие любого количества AV-программ. Хотя я ожидаю предупреждения, если вы отключили уведомления, вы можете не увидеть его, кроме как в журналах. Я бы порекомендовал отключить интернет, затем вашу AV-программу, попробуйте снова.
zenbike

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

@zenbike: Почему добавление пользовательских правил udev запускает антивирусную программу?
user1686 15.07.11

Запуск любого сценария при вставке устройства может вызвать ложные срабатывания в наборе AV для сканирования съемных устройств. Почему я не знаю. То, что это случилось со мной с фабрично установленным скриптом на флеш-накопителе и 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 26.09.12

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;сделал трюк для меня с уведомить-отправить
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

В этом случае проблема может быть в самом скрипте. Например, это может зависеть от переменной en PAT $ PATH. Для теста попробуйте запустить его как 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.