У меня возникли проблемы с правилом udev
. На данный момент я настроил правило udev для выполнения сценария, когда телефон Android подключен к любому USB-порту компьютера. Но я не хочу, чтобы скрипт выполнялся с каждого USB-порта. Я просто хочу, чтобы скрипт выполнялся, например, когда телефон подключен к 4-му USB-порту, и ничего не должно происходить, когда он подключен к 1-му, 2-му или 3-му USB-порту.
Как мне этого добиться и как определить, например, 4-й порт USB?
Буду очень признателен за вашу помощь.
Мое текущее правило udev:
KERNELS="1-2:1.1", ACTION=="add", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}!="1d6b", ATTRS{idVendor}!="203a", ATTRS{idVendor}=="****", ATTRS{idProduct}=="****", RUN+="/usr/local/bin/tmp.sh $attr{serial}"
В целом, любое включенное устройство получают некоторые соответствующие узлы в SYSFS /sys
, некоторые включают другие узлы /dev
.
Используя sysfs:
Следите за развитием udev событий
sudo udevadm monitor
Включите свое устройство и наблюдайте за предыдущим выводом команды, примером
monitor will print the received events for:
UDEV - the event which udev sends out after rule processing
KERNEL - the kernel uevent
KERNEL[5797.642807] add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.4 (usb)
KERNEL[5797.643604] add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.4/2-1.4:1.0 (usb)
UDEV [5797.659463] add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.4 (usb)
UDEV [5798.753894] add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.4/2-1.4:1.0 (usb)
Таким образом в формате bus-port.port:config.interface
посмотрите ссылку: Bus:2, Port:1 (базируются концентратор), Port:4 (внешний USB-порт), Config:1 (включенное устройство), Interface:0
Полное имя USB-порта 2-1.4
.
Проверять его атрибуты:
udevadm info -a /sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.4
Или устройство (что порт является родительским узлом его),
udevadm info -a /sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.4/2-1.4:1.0
Используя /dev
:
Телефон на базе Android как модем, это создает последовательный порт в /dev
. Для знания нового включенного устройства Посмотрите, Как предоставить доступ программного обеспечения к каким-либо USB-устройствам?
udevadm info -a /dev/ttyACM0
Иначе, для получения порта dmesg
или:
tail -f /var/log/kernel.log
Затем используйте номер порта для KERNELS=="2-1.4"
или KERNELS=="2-1.4:1.[0-9]*"
Ссылки: