获取给定设备 ID 的 USB 设备路径

获取给定设备 ID 的 USB 设备路径

将 USB 插入我的机器的端口后,如果我这样做,lsusb我会看到我正在寻找的设备:

Bus 001 Device 004: ID 04f2:b573 Some Manufacturer

如果我在 下列出设备/dev/,我可以看到很多设备路径,例如/dev/tty0/dev/ttyUSB0...等。据我了解,这些路径之一将是我的 USB 设备,或者是我的 USB 设备连接的位置。

我如何知道哪一位是有 ID 的04f2:b573


这个问题然而与我的类似(指的是接受的答案)我不知道到底是什么$ID_SERIAL,或者如何将其设置为等于我正在寻找的Id,甚至不知道什么是正确的路径(因为他的示例显示了多个设备路径,例如/dev/ttyACM0,,,.. .)/dev/sdb/dev/input/event5

另外,第二个答案假设我知道设备已连接到/dev/ttyUSB0,而我事先并不知道(顺便说一下,在这个特定路径上测试它没有给我任何设备)。

答案1

我如何知道哪一位是有 ID 的04f2:b573

可能有更好的方法来做到这一点,但一种快速而肮脏的方法是:

find_by_id(){
    v=${1%:*}; p=${1#*:}  # split vid:pid into 2 vars
    v=${v#${v%%[!0]*}}; p=${p#${p%%[!0]*}}  # strip leading zeros
    grep -il "^PRODUCT=$v/$p" /sys/bus/usb/devices/*:*/uevent |
    sed s,uevent,, |
    xargs -r grep -r '^DEVNAME=' --include uevent
}
find_by_id 04f2:b573

我的旧华为手机显示为两个串行 tty:

$ find_by_id 12d1:
/sys/bus/usb/devices/3-1:1.0/ttyUSB0/tty/ttyUSB0/uevent:DEVNAME=ttyUSB0
/sys/bus/usb/devices/3-1:1.1/ttyUSB1/tty/ttyUSB1/uevent:DEVNAME=ttyUSB1

您可以将最后一个 grep 更改为

xargs -r egrep -rB2 '^DEVNAME=|^IFINDEX=' --include uevent

为了同时找到 USB 网络接口:

$ find_by_id 0e8d:
/sys/bus/usb/devices/1-6.2.3:1.0/net/usb0/uevent-INTERFACE=usb0
/sys/bus/usb/devices/1-6.2.3:1.0/net/usb0/uevent:IFINDEX=10

$ find_by_id 03f0:
/sys/bus/usb/devices/1-6.3:1.1/usbmisc/lp1/uevent-MAJOR=180
/sys/bus/usb/devices/1-6.3:1.1/usbmisc/lp1/uevent-MINOR=1
/sys/bus/usb/devices/1-6.3:1.1/usbmisc/lp1/uevent:DEVNAME=usb/lp1

答案2

@mosvy 的答案不适用于 Debian 系统,因为 /sys/bus/usb/devices 包含符号链接。它也无法通过跟随符号链接来工作,grep -R因为该文件系统包含符号链接循环。

获得所需内容的更简单方法是:

lsusb | grep NameOfYourDevice | sed -nr 's|Bus (.*) Device ([^:]*):.*|/dev/bus/usb/\1/\2|p'

它将 lsusb 的输出(来自 usbutils 包)转换为 /dev/bus/usb/... 路径

如果您需要块/字符设备名称,请尝试如下所示:

device() {
    v=${1%:*}; p=${1#*:}
    for dir in `find /sys/ -name idVendor | rev | cut -d/ -f 2- | rev`; do
        if grep -q $v $dir/idVendor; then
            if grep -q $p $dir/idProduct; then
                find $dir -name 'device' | rev | cut -d / -f 2 | rev
            fi
        fi
    done
}

答案3

我不确定它是否适用于所有 *unix 系统。但在我的电脑上,我可以访问/dev/bus/{BUSID}/{DEVICEID}.总线 id 和设备 id 就是lsusb给出的。

相关内容