lệnh để xác định cổng của thiết bị (như / dev / ttyUSB0)


46

Tôi có một câu hỏi liên quan đến các cổng trong Linux. Nếu tôi kết nối thiết bị của mình qua USB và muốn kiểm tra cổng của thiết bị, tôi không thể thực hiện bằng lệnh lsusb, chỉ chỉ định số xe buýt và số thiết bị trên xe buýt này:

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

Có lệnh nào cho tôi biết cổng mà thiết bị được kết nối trực tiếp không? Cách duy nhất để làm điều này cho đến bây giờ là làm rối loạn và kết nối lại và sử dụng lệnh:

[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

Trong dòng cuối cùng có thể thấy rằng thiết bị của tôi được kết nối với / dev / ttyUSB0 .


Bạn đang cố gắng để thực hiện? Bạn có muốn liên kết một thiết bị /devvới một mục trong lsusb? Hoặc bạn có muốn liệt kê tất cả các thiết bị /devcó nguồn gốc từ một thiết bị USB vật lý không? Hay bạn chỉ muốn ls /dev/ttyUSB*?
Patrick

Tôi chỉ cần một lệnh sẽ cung cấp cho tôi cổng của thiết bị và sẽ không đẩy tôi ngắt kết nối và kết nối lại thiết bị của mình. ls /dev/ttyUSB*sẽ chỉ liệt kê 10 cổng maybee nhưng từ danh sách này tôi không thể biết cổng nào dành cho thiết bị của mình.
71GA

Tôi thấy điều này là hữu ích. lsusb -v
tjaart55

Câu trả lời:


80

Tôi không chắc chắn những gì bạn đang hỏi. Bạn đề cập đến 'cổng' nhiều lần, nhưng trong ví dụ của bạn, bạn nói câu trả lời là /dev/ttyUSB0, đó là đường dẫn thiết bị, không phải cổng. Vì vậy, câu trả lời này là về việc tìm đường dẫn dev cho mỗi thiết bị.

Dưới đây là một tập lệnh nhanh và bẩn đi qua các thiết bị để /systìm kiếm các thiết bị USB có ID_SERIALthuộc tính. Thông thường chỉ có các thiết bị USB thực sự sẽ có thuộc tính này và vì vậy chúng tôi có thể lọc với nó. Nếu chúng tôi không, bạn sẽ thấy rất nhiều thứ trong danh sách không phải là thiết bị vật lý.

#!/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

Trên hệ thống của tôi, kết quả này như sau:

/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

Giải trình:

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

Các thiết bị hiển thị trong /devcó một devtập tin trong /systhư mục của họ . Vì vậy, chúng tôi tìm kiếm các thư mục phù hợp với tiêu chí này.
 

syspath="${sysdevpath%/dev}"

Chúng tôi muốn đường dẫn thư mục, vì vậy chúng tôi loại bỏ /dev.
 

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

Điều này cho chúng ta đường dẫn /devtương ứng với /systhiết bị này .
 

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

Điều này lọc ra những thứ không phải là thiết bị thực tế. Nếu không, bạn sẽ nhận được những thứ như bộ điều khiển & trung tâm USB.
 

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

Các udevadm info -q property --exportdanh sách lệnh tất cả các thuộc tính thiết bị trong một định dạng mà có thể được phân tích bằng vỏ vào các biến. Vì vậy, chúng tôi chỉ đơn giản là kêu gọi evalnày. Đây cũng là lý do tại sao chúng tôi bọc mã trong ngoặc đơn, để chúng tôi sử dụng một lớp con và các biến được xóa trên mỗi vòng lặp.
 

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

Lọc nhiều thứ không phải là thiết bị thực tế.
 

echo "/dev/$devname - $ID_SERIAL"

Tôi hy vọng bạn biết những gì dòng này làm :-)


2
Cảm ơn bạn. Tôi sẽ học được rất nhiều từ anwser của bạn và bây giờ tôi thấy điều khoản đó hoàn toàn rõ ràng với tôi. Có cách nào ngắn hơn không? Maybee một lệnh đã được tích hợp trong chính Linux?
71GA

Không. Nếu có một lệnh đã có từ trước, tôi rất vui lòng giới thiệu nó.
Patrick

Đề xuất thay đổi / bin / bash thành / bin / sh và xóa () để tương thích tối đa
albfan

10

Bạn có thể sử dụng lệnh này để khám phá thiết bị của mình nếu được kết nối với usb0:

udevadm info -a -p  $(udevadm info -q path -n /dev/ttyUSB0)

Câu trả lời hàng đầu không hoạt động trên máy của tôi, nhưng điều này hoạt động rất tốt. Cảm ơn!
johnny_boy

2

Bạn có thể thử một cái gì đó như thế này dưới đây.

echo -n "/dev/"; dmesg | grep tty|grep USB|rev|awk '{print $1}'|rev

nợ mắt tôi dmesg | awk '/tty/ && /USB/ {print "/dev/"$1}' (Mã tương đương nhưng sạch sẽ ... nhưng vẫn là mã lạ; tại sao không chỉ là ttyUSB với nhau? Và 2x rev là gì?)
Peter

1
Trường revđược sử dụng để trường cuối cùng được truy cập, trường này có thể được thay thế bằng $NF: chodmesg | awk '/tty/ && /USB/ {print "/dev/"$NF}'
Léo Germond

2

Có lẽ bạn chỉ muốn biết đường dẫn đến bộ chuyển đổi nối tiếp USB được kết nối lần cuối?

dmesg | awk '/tty/ && /USB/ {print "/dev/"$10}'|tail -1

2

Giả sử rằng bạn biết thiết bị bạn đã cắm là gì, trong 14.04 Ubuntu, ít nhất, có một lệnh usb-devicesmà bạn có thể xem qua và tìm thông tin:

$ 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

Và dòng đầu tiên liệt kê xe buýt và cổng, cũng như số thiết bị lsusbcung cấp.


Đây là câu trả lời đúng, không chắc tại sao nó không có nhiều phiếu hơn. Phần còn lại là mớ hỗn độn của awk, v.v.
Eric Drechsel

1
điều này không hiển thị /dev/*đường dẫn
xinthose
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.