команда для определения портов устройства (например, / dev / ttyUSB0)

47

У меня вопрос по поводу портов в Linux. Если я подключаю свое устройство через USB и хочу проверить его порт, я не могу сделать это с помощью команды lsusb, которая указывает только номер шины и номер устройства на этой шине:

[ziga@Ziga-PC ~]$ lsusb
Bus 003 Device 007: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC

Есть ли команда, которая сообщает мне порт, к которому устройство подключено напрямую? Единственный способ сделать это до сих пор заключался в том, чтобы отключить и повторно подключиться и использовать команду:

[ziga@Ziga-PC ~]$ dmesg | grep tty
[    0.000000] console [tty0] enabled
[    0.929510] 00:09: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[    4.378109] systemd[1]: Starting system-getty.slice.
[    4.378543] systemd[1]: Created slice system-getty.slice.
[    8.786474] usb 3-4.4: FTDI USB Serial Device converter now attached to ttyUSB0

В последней строке видно, что мое устройство подключено к / dev / ttyUSB0 .

71Ga
источник
Что вы пытаетесь достичь? Хотите связать устройство /devс записью в lsusb? Или вы хотите перечислить все устройства, /devкоторые являются производными от физического USB-устройства? Или ты просто хочешь ls /dev/ttyUSB*?
Патрик
Мне просто нужна команда, которая даст мне порт устройства и не будет подталкивать меня к отключению и повторному подключению моих устройств. ls /dev/ttyUSB*Я перечислю только 10 портов, но из этого списка я не могу сказать, какой из них для моего устройства.
71GA
Я нашел это полезным. lsusb -v
tjaart55

Ответы:

81

Я не совсем уверен, что вы спрашиваете. Вы упоминаете «порт» несколько раз, но затем в своем примере вы говорите, что ответом является /dev/ttyUSB0путь устройства, а не порт. Таким образом, этот ответ о поиске пути разработки для каждого устройства.

Ниже приведен быстрый и грязный скрипт, который просматривает устройства в /sysпоиске USB-устройств с ID_SERIALатрибутом. Обычно только настоящие USB-устройства будут иметь этот атрибут, и мы можем фильтровать его. Если мы этого не сделаем, вы увидите в списке много вещей, которые не являются физическими устройствами.

#!/bin/bash

for sysdevpath in $(find /sys/bus/usb/devices/usb*/ -name dev); do
    (
        syspath="${sysdevpath%/dev}"
        devname="$(udevadm info -q name -p $syspath)"
        [[ "$devname" == "bus/"* ]] && continue
        eval "$(udevadm info -q property --export -p $syspath)"
        [[ -z "$ID_SERIAL" ]] && continue
        echo "/dev/$devname - $ID_SERIAL"
    )
done

В моей системе это приводит к следующему:

/dev/ttyACM0 - LG_Electronics_Inc._LGE_Android_Phone_VS930_4G-991c470
/dev/sdb - Lexar_USB_Flash_Drive_AA26MYU15PJ5QFCL-0:0
/dev/sdb1 - Lexar_USB_Flash_Drive_AA26MYU15PJ5QFCL-0:0
/dev/input/event5 - Logitech_USB_Receiver
/dev/input/mouse1 - Logitech_USB_Receiver
/dev/input/event2 - Razer_Razer_Diamondback_3G
/dev/input/mouse0 - Razer_Razer_Diamondback_3G
/dev/input/event3 - Logitech_HID_compliant_keyboard
/dev/input/event4 - Logitech_HID_compliant_keyboard

Объяснение:

find /sys/bus/usb/devices/usb*/ -name dev

Устройства, которые отображаются в, /devимеют devфайл в своем /sysкаталоге. Поэтому мы ищем каталоги, соответствующие этим критериям.
 

syspath="${sysdevpath%/dev}"

Нам нужен путь к каталогу, поэтому мы удалим его /dev.
 

devname="$(udevadm info -q name -p $syspath)"

Это дает нам путь, /devкоторый соответствует этому /sysустройству.
 

[[ "$devname" == "bus/"* ]] && continue

Это отфильтровывает вещи, которые не являются фактическими устройствами. В противном случае вы получите такие вещи, как USB-контроллеры и концентраторы.
 

eval "$(udevadm info -q property --export -p $syspath)"

Команда udevadm info -q property --exportвыводит список всех свойств устройства в формате, который может быть проанализирован оболочкой в ​​переменные. Поэтому мы просто призываем evalк этому. Это также причина, по которой мы заключаем код в круглые скобки, чтобы мы использовали подоболочку, а переменные стирались в каждом цикле.
 

[[ -z "$ID_SERIAL" ]] && continue

Больше фильтрации вещей, которые не являются реальными устройствами.
 

echo "/dev/$devname - $ID_SERIAL"

Я надеюсь, что вы знаете, что делает эта строка :-)

Патрик
источник
2
Спасибо. Я многому научусь у вашего ответа, и теперь я вижу, что эти термины совершенно не ясны для меня. Есть ли более короткий путь? Может быть, команда уже интегрирована в сам Linux?
71GA
Нет. Если бы существовала уже существующая команда, я бы с радостью порекомендовал ее.
Патрик
Предложите изменить / bin / bash на / bin / sh и удалить () для максимальной совместимости
albfan
10

Вы можете использовать эту команду для исследования вашего устройства, если оно подключено к usb0:

udevadm info -a -p  $(udevadm info -q path -n /dev/ttyUSB0)
Нэвин
источник
Лучший ответ не работал на моей машине, но это работало отлично. Спасибо!
johnny_boy
2

Вы можете попробовать что-то вроде этого ниже.

echo -n "/dev/"; dmesg | grep tty|grep USB|rev|awk '{print $1}'|rev
VeggieVampire
источник
Ой мои глаза! dmesg | awk '/tty/ && /USB/ {print "/dev/"$1}' (Эквивалентный, но чистый ... но все же странный код; почему не просто ttyUSB вместе? И для чего был 2x rev?)
Питер
1
revИспользуется поэтому последнее поле доступа, это может быть заменено $NF: даваяdmesg | awk '/tty/ && /USB/ {print "/dev/"$NF}'
Léo GERMOND
2

Возможно, вы хотели бы узнать только путь к USB-последовательному адаптеру, который подключался последним?

dmesg | awk '/tty/ && /USB/ {print "/dev/"$10}'|tail -1
HRmeteohub
источник
2

Предполагая, что вы знаете, какое устройство вы подключили, по крайней мере, в Ubuntu 14.04 есть команда, usb-devicesкоторую вы можете просмотреть и найти информацию:

$ usb-devices

T:  Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#=  1 Spd=480 MxCh= 3
D:  Ver= 2.00 Cls=09(hub  ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=1d6b ProdID=0002 Rev=04.04
S:  Manufacturer=Linux 4.4.0-131-generic ehci_hcd
S:  Product=EHCI Host Controller
S:  SerialNumber=0000:00:1a.0
C:  #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=0mA
I:  If#= 0 Alt= 0 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=00 Driver=hub

И первая строка перечисляет шину и порт, а также номер устройства, которое lsusbдает.

Gertlex
источник
Это правильный ответ, не уверен, почему у него нет больше голосов. Остальные - беспорядки awk и т. Д.
Эрик Дрехсел
2
это не показывает /dev/*путь
xinthose