udev правила для каждого устройства USB

Я пытаюсь выполнить скрипт всякий раз, когда USB подключен. В настоящее время у меня есть демонстрационный скрипт в /usr/local/test.sh:

#!/bin/bash

touch /home/kfir/test.txt

У меня также есть файл правил, который пытается соответствовать любому USB в /etc/udev/rules.d/100-usb.rules:

ACTION=="add", ATTRS{idVendor}=="****", ATTRS{idProduct}=="****", RUN+="/usr/local/test.sh"

Проблема в том, что файл test.txt никогда не создается. Я также получаю следующую ошибку:

Я не знаю, что делать сейчас. То, что я хочу достичь, довольно просто, когда есть USB-накопитель, подключенный к сети, запустите простой скрипт (создав в этом случае файл test.txt).

P.S. файл test.sh работает нормально. Когда я вручную ее запускал, он создает файл test.txt.

1
задан 4 September 2015 в 17:06

1 ответ

Эти ATTRS{idVendor}=="****", ATTRS{idProduct}=="****" нацелены на что угодно, вы можете удалить их из правила. Тем не менее, он будет запущен для многих узлов дерева и для всех устройств, даже не USB. Попробуйте это правило, которое нацелено на один узел и только на USB-устройства:
ACTION=="add", SUBSYSTEM=="usb", DRIVER=="usb", RUN+="/usr/local/test.sh"
Как я это понял: Запустите udevadm monitor -u Подключите флешку, он выдает то же самое, что и:
UDEV  [13394.985946] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3 (usb)                                                                        
UDEV  [13394.991173] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0 (usb)                                                                
UDEV  [13394.992509] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/host9 (scsi)                                                         
UDEV  [13394.993436] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/host9/scsi_host/host9 (scsi_host)                                    
UDEV  [13395.978250] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/host9/target9:0:0 (scsi)                                             
UDEV  [13395.979665] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/host9/target9:0:0/9:0:0:0 (scsi)                                     
UDEV  [13395.980363] add      /devices/virtual/bdi/8:32 (bdi)                                                                                        
UDEV  [13395.981822] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/host9/target9:0:0/9:0:0:0/scsi_disk/9:0:0:0 (scsi_disk)              
UDEV  [13395.982998] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/host9/target9:0:0/9:0:0:0/bsg/9:0:0:0 (bsg)                          
UDEV  [13395.983447] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/host9/target9:0:0/9:0:0:0/scsi_device/9:0:0:0 (scsi_device)          
UDEV  [13395.983970] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/host9/target9:0:0/9:0:0:0/scsi_generic/sg4 (scsi_generic)            
UDEV  [13396.473531] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/host9/target9:0:0/9:0:0:0/block/sdc (block)                          
UDEV  [13396.528471] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/host9/target9:0:0/9:0:0:0/block/sdc/sdc1 (block)
Возьмите головной узел, проверяя его атрибуты, используя:
udevadm info -a --path=/sys/devices/pci0000:00/0000:00:14.0/usb1/1-3
Выход:
Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/pci0000:00/0000:00:14.0/usb1/1-3':
    KERNEL=="1-3"
    SUBSYSTEM=="usb"
    DRIVER=="usb"
    ATTR{bDeviceSubClass}=="00"
    ATTR{bDeviceProtocol}=="00"
    ATTR{devpath}=="3"
    ATTR{idVendor}=="125f"
    ATTR{speed}=="480"
    ATTR{bNumInterfaces}==" 1"
    ATTR{bConfigurationValue}=="1"
    ATTR{bMaxPacketSize0}=="64"
    ATTR{busnum}=="1"
    ATTR{devnum}=="5"
    ATTR{configuration}==""
    ATTR{bMaxPower}=="98mA"
    ATTR{authorized}=="1"
    ATTR{bmAttributes}=="80"
    ATTR{bNumConfigurations}=="1"
    ATTR{maxchild}=="0"
    ATTR{bcdDevice}=="0100"
    ATTR{avoid_reset_quirk}=="0"
    ATTR{quirks}=="0x0"
    ATTR{serial}=="2b712383811292"
    ATTR{version}==" 2.00"
    ATTR{urbnum}=="673"
    ATTR{ltm_capable}=="no"
    ATTR{manufacturer}=="ADATA"
    ATTR{removable}=="unknown"
    ATTR{idProduct}=="c96a"
    ATTR{bDeviceClass}=="00"
    ATTR{product}=="ADATA USB Flash Drive"
Теперь мы проверили только одно устройство, если мы проверим больше устройств: телефон, мышь ... мы узнаем, что SUBSYSTEM=="usb" и DRIVER=="usb" одинаковы для всех USB-устройств. Поэтому они могут использоваться для соответствия правилам.
4
ответ дан 23 May 2018 в 17:44
  • 1
    Я действительно хочу настроить таргетинг только на флеш-диски, потому что мой сценарий использования смотрит, существует ли каталог на флеш-накопителе, который только что был подключен, и если он существует, скопируйте его в предварительно определенное местоположение. Поскольку я не знаю, какой USB-интерфейс будет использовать конечный пользователь, или на каком порту он подключит его, я решил настроить таргетинг на все USB-устройства и запустить сценарий, который ищет эту папку. Мне действительно нравится идея, что здесь будут нацелены только USB-устройства. Можно ли ограничить его только флеш-накопителями? Кстати, работает ****. Может быть, это игнорирует правило, поскольку оно недействительно? – kfirba 6 September 2015 в 07:13
  • 2
    Да, это возможно, и в этом случае удобнее ориентировать узлы листа, потому что это тот, который соответствует разделам (Ex: /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/host9/target9:0:0/9:0:0:0/block/sdc/sdc1). К счастью, именно так, как вы хотите, ответили здесь askubuntu.com/q/625243/26246 . Да, я пробовал ****, и он работает :), то же самое для *, я никогда не пробовал этого, этот способ стал бесполезным. (матч что-нибудь) – user.dz 6 September 2015 в 10:21

Другие вопросы по тегам:

Похожие вопросы: