команда для визначення портів пристрою (наприклад / dev / ttyUSB0)


46

У мене питання щодо портів у 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 .


Що ви намагаєтеся досягти? Ви хочете пов’язати пристрій /devіз записом lsusb? Або ви хочете перерахувати всі пристрої /dev, отримані від фізичного пристрою USB? Або ти просто хочеш ls /dev/ttyUSB*?
Патрік

Мені просто потрібна команда, яка дасть мені порт пристрою і не підштовхне мене до відключення та підключення моїх пристроїв. ls /dev/ttyUSB*відображатиметься лише 10 портів, можливо, але з цього списку я не можу сказати, який саме для мого пристрою.
71ГА

Я вважаю це корисним. lsusb -v
tjaart55

Відповіді:


80

Я не зовсім впевнений, про що ви питаєте. Ви кілька разів згадуєте про «порт», але потім у своєму прикладі ви кажете, що відповідь - /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?
71ГА

Ні. Якби була попередня команда, я б із радістю рекомендував її.
Патрік

Запропонуйте змінити / 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

ой мої очі! 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

2

Якщо припустити, що ви знаєте, що таке пристрій, який ви підключили, то в принаймні 14.04 Ubuntu є команда, 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дає.


Це правильна відповідь, не впевнений, чому у неї немає більше голосів. Решта - помилки awk тощо
Ерік Дрехсель

1
це не показує /dev/*шлях
xinthose
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.