Я должен записать сценарий для перезапуска аппаратные ключи USB. У меня есть все инструменты, но я не могу связать свой/dev/ttyUSBx с физической шиной и УСТРОЙСТВОМ. Проблема - то, что у меня есть три аппаратных ключа с тем же идентификационным поставщиком и идентификационным продуктом.
Если я делаю lsusb, вывод:
Bus 001 Device 004: ID 12d1:1003 Huawei Technologies Co., Ltd. E220 HSDPA Modem / E270 HSDPA/HSUPA Modem
Bus 001 Device 006: ID 12d1:1003 Huawei Technologies Co., Ltd. E220 HSDPA Modem / E270 HSDPA/HSUPA Modem
Bus 001 Device 007: ID 12d1:1003 Huawei Technologies Co., Ltd. E220 HSDPA Modem / E270 HSDPA/HSUPA Modem
Bus 001 Device 002: ID 80ee:0021
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
И я присоединил его к:
/dev/ttyUSB0
/dev/ttyUSB3
/dev/ttyUSB5
Но я хочу знать, какое устройство связано с который Устройство Шины. Примером я должен получить следующее:
/dev/ttyUSB0 -> Bus 001 Device 006
/dev/ttyUSB3 -> Bus 001 Device 004
/dev/ttyUSB5 -> Bus 001 Device 007
Я использую Сервер Ubuntu 10.04, и я протестировал инструменты:
lsusb
hal
lsmod
Но я не могу получить отношения.
Так как у меня нет Ваших аппаратных средств, я не могу дать Вам точный ответ.
я предложил бы, чтобы Вы перешли к рассматриваемому устройству, например:
ls -l /dev/ttyUSB0
и получают главные и незначительные числа узла. Скажем, им 116 лет, 7
Затем переходят в:
ls -l /sys/dev/char/116:7
(char
, потому что tty является устройством посимвольного ввода-вывода при трассировке вниз дискового устройства, Вы указали бы block
вместо char
)
В выводе от команды, как которая Вы будете видеть что-то немного:
lrwxrwxrwx 1 root root 0 Sep 6 00:17 116:7 -> ../../devices//sys/devices/pci0000:00/0000:00:13.5/pci0000:00/0000:00:13.5/usb1/1-3/1-3:1.1/sound/card1/pcmC1D0c
каталог /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/
и его подкаталоги имеют много информации об устройстве. Как пример, /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/busnum
и /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/devnum
. В моей системе они соответствуют номеру шины и номеру устройства, упомянутому в записях замены в горячем режиме устройства в/var/log/syslog.
Что-то еще, что работает над моей системой для/dev/video0:
find /sys/dev -lname '*video0' -exec cat {}/device/busnum {}/device/devnum \; 2>/dev/null
Действительно нет хорошего способа отобразить устройства посимвольного ввода-вывода как /dev/ttyUSB0
к соответствующему USB-устройству и номерам шины. НО, это возможно!
Что-то вроде этого могло бы работать:
udevadm info --name=/dev/ttyUSB0 --attribute-walk
Оттуда, Вы получите набор информации об устройстве и его родительских устройствах. Теперь, это - просто все о парсинге тех данных для получения то, что Вы хотите. Я использовал это в прошлом:
echo /dev/bus/usb/`udevadm info --name=/dev/ttyUSB0 --attribute-walk | sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\4/p' | head -n 2 | awk '{$1 = sprintf("%03d", $1); print}'` | tr " " "/"
Теперь, если это не полный рот, я не знаю то, что! Давайте сломаем его:
udevadm info --name=/dev/ttyUSB0 --attribute-walk
- информация о возвратах об устройстве и его родительских устройствах
sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\4/p'
- синтаксические анализы эти данные и возвраты любые строки, содержащие атрибут "devnum" или "busnum". Мы предположим, что "busnum" перечислен сначала..., и в этом случае... мы можем просто захватить первые две строки вывода.
head -n 2
- Захватите первые 2 строки вывода. Мы могли стать более необычными здесь, но мы просто делаем предположение, что "busnum" и "devnum" самого близкого родителя будут перечисленными сначала.
awk '{$1 = sprintf("%03d", $1); print}'
- Берет те цифры и заполняет их нулями.
echo /dev/bus/usb
... - весь этот джаз обернут в echo
оператор для замены новых строк пробелами. Можно добавить -n
кому: echo
если Вы хотите отключить запаздывающую новую строку.
tr " " "/"
- замените пробелы в выводе с наклонными чертами вправо
Это произведет что-то как:
/dev/bus/usb/001/011
... который, конечно, является устройством. Если Вы хотели бы, можно легко произвести что-то как busnum:001 devnum:011
с несколькими тонкими настройками:
echo `udevadm info --name=/dev/ttyUSB0 --attribute-walk | sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\1\ \4/p' | head -n 2 | awk '{$1 = sprintf("%s:%03d", $1, $2); print $1;}'`
Вы можете найти всю информацию об использовании узла ниже команды:
udevadm info -a -p /sys/bus/usb-serial/devices/ttyUSB0/