Мне нужно написать скрипт для перезапуска 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 Server 10.04 и я тестировал инструменты:
lsusb
hal
lsmod
Но я не могу получить отношения.
На самом деле не существует хорошего способа сопоставления символьных устройств, например,
/dev/ttyUSB0
с соответствующими USB-устройствами и номерами шин. НО это возможно!Нечто подобное может работать:
udevadm info --name=/dev/ttyUSB0 --attribute-walk
Оттуда вы получите кучу информации об устройстве и его родительских устройствах. Теперь нужно просто проанализировать эти данные, чтобы получить то, что вы хотите. Я использовал это в прошлом:
Теперь, если это не глоток, я не знаю, что это! Давайте разберемся с этим:
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 " " "/"
- заменить пробелы в выводе косыми чертамиЭто выведет что-то вроде:
... который, конечно, является устройством. Если вы хотите, вы можете легко вывести что-то вроде
busnum:001 devnum:011
нескольких настроек:источник
Вы можете найти всю информацию об узле, используя следующую команду:
источник