Как запустить сценарий оболочки при обнаружении нового устройства хранения USB?

17

Мне нужен сценарий, который удаляет журнал и начинает его регистрировать, как только загружается массовое хранилище usb (с файлом «OKdump» на нем). И если что-то ненормальное (как и визуальная видимость), обнаружено, что я хочу, чтобы он сделал снимок экрана и сохранил его на том же диске.

    
задан Amith KK 24.06.2011 в 13:12
источник

1 ответ

13

Используйте Udev. Удэв - демон-диспетчер устройств. Помимо всего прочего, он отвечает за именование ваших устройств. Вы можете определить udev-правила, поместив файлы с определенным синтаксисом в каталог правил. Правила могут делать много вещей - в частности, они могут запускать скрипты, когда подключено определенное устройство.

Как решить вашу проблему:

Сначала вам нужно собрать информацию на своем устройстве. Предположим, вы подключили его, и знаете, что он идет под именем /dev/sdb1 . Если так запустить:

udevadm info -a -p $(udevadm info -q path -n /dev/sdb1)

Команда выведет информацию о вашем устройстве. Это довольно длинный. Вам нужно найти то, что однозначно идентифицирует устройство. Это может быть серийный номер ATTRS{serial}=="UA04FLGC" или комбинация других атрибутов, таких как ATTRS{idVendor} и ATTRS{idProduct} . Большинство имен более или менее понятны. Выберите один или несколько из нескольких, которые кажутся разумными - если они не работают, попробуйте что-то еще.

Как только вы нашли уникальный идентификатор, создайте файл в /etc/udev/rules.d , который начинается с двух цифр и заканчивается .rules . Две цифры указывают порядок обработки этих .rules-файлов - 70-usb-log-custom.rules - прекрасный выбор для вас. Синтаксис этого файла правил может быть очень сложным. Если вам интересно, google udev. Если вы не просто открываете вновь созданный файл и редактируете его, чтобы выглядеть примерно так:

# /etc/udev/rules.d/70-usb-log-custom.rules

KERNEL=="sd?1", ATTRS{serial}=="UA04FLGC", ACTION=="add", SYMLINK+="cusb1", RUN+="/home/confus/bin/usb-encrypt.sh add %k"
ENV{ID_FS_USAGE}=="crypto", ACTION=="remove", RUN+="/home/confus/bin/usb-encrypt.sh remove %k"
SUBSYSTEM=="usb", SYSFS{idVendor}=="1781", SYSFS{idProduct}=="0c9f", GROUP="users", MODE="0666"

Это фактический файл udev, который я использую. В нем есть три правила. Каждая строка является правилом ее собственной. Первая строка запускает скрипт для создания расшифрованного устройства всякий раз, когда подключен зашифрованный диск. Вторая строка вызывает тот же скрипт с различными параметрами в случае удаления дешифрованного устройства. Третья строка устанавливает разрешения для другого связанного устройства.

Скорее всего, вам понадобится только первая строка. Удалите остальные и вставьте правильный серийный номер (или составные параметры, выбранные вами для идентификации вашего устройства).

Объяснение моего файла:

KERNEL=="sd?1" говорит, что устройство, которое мы ищем в этом правиле, называется в строках /dev/sda1 , /dev/sdc1 или что-то в этом роде. Вопросительный знак является шаблоном для любой буквы. ATTRS{serial}=="UA04FLGC" - уникальный идентификатор здесь. Для другого устройства, о котором я говорил (третья строка), я не использую серийный номер, а комбинацию SYSFS{idVendor}=="1781" и SYSFS{idProduct}=="0c9f" , чтобы идентифицировать его.

ACTION=="add" сообщает правилу, что он должен действовать только при добавлении устройства; а не при удалении.

SYMLINK+="cusb1" создает символическую ссылку на диск, поэтому ее можно найти в файле /dev/cusb1 .

RUN+="/home/confus/bin/usb-encrypt.sh add %k" запускает скрипт и передает ему «добавить» и «% k» (имя устройства).

Я не буду давать больше подробностей, так как есть отличные уроки по правилам udev. То, что вы читаете здесь, должно быть достаточно, чтобы его можно было рассмотреть.

    
ответ дан con-f-use 24.06.2011 в 16:09
источник