用于确定设备端口的命令(例如/ 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*
Patrick

我只需要一个命令即可给我设备的端口,而不会强迫我断开连接并重新连接设备。ls /dev/ttyUSB*只会列出可能的10个端口,但是从该列表中我无法确定哪个端口适合我的设备。
2014年

我发现这很有帮助。lsusb -v
tjaart55

Answers:


80

我不确定您要问什么。您多次提到“端口”,但是在您的示例中,答案是/dev/ttyUSB0,这是设备开发路径,而不是端口。因此,此答案是关于找到每个设备的开发路径。

下面是一个快速且肮脏的脚本,该脚本在/sys查找具有ID_SERIAL属性的USB设备的过程中遍历了设备。通常,只有真正的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命令以Shell可以解析为变量的格式列出所有设备属性。所以我们简单地呼吁eval这一点。这也是我们将代码包装在括号中的原因,以便我们使用子外壳,并在每个循环中擦除变量。
 

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

对不是实际设备的事物进行更多过滤。
 

echo "/dev/$devname - $ID_SERIAL"

我希望你知道这行的作用:-)


2
谢谢。我将从您的咨询师那里学到很多东西,现在我发现这些术语对我来说还不是很清楚。有没有更短的方法?Maybee一个已经集成在Linux本身中的命令?
71GA 2014年

不。如果有一个预先存在的命令,我会很乐意推荐它。
帕特里克

建议将/ 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的作用是什么?)
Peter

1
rev被使用,因此最后一个字段访问,这可以被替换为$NF:让dmesg | awk '/tty/ && /USB/ {print "/dev/"$NF}'
莱奥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的混乱等等
埃里克Drechsel

1
这并不显示/dev/*路径
xinthose
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.