将 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
给出的。