usb-devices 命令是 usbutils 软件包的一部分,它通过读取 /sys/bus/usb/devices/ 目录下的信息来显示USB设备的详细配置。
usb-devices 通常包含在 usbutils 包中:
sudo apt update
sudo apt install usbutils
sudo yum install usbutils
which usb-devices 或 usb-devices --version 2>/dev/null || echo "未安装"
usb-devices [选项]
选项:可选参数,用于控制输出格式或筛选设备-h 或 --help:显示帮助信息-V 或 --version:显示版本信息usb-devices 的输出格式比较固定,每个USB设备输出一个块,块之间用空行分隔:
| 字段 | 说明 |
|---|---|
T: |
设备拓扑信息 (Topology) |
B: |
带宽信息 (Bandwidth) |
D: |
设备描述符 (Device Descriptor) |
P: |
产品ID字符串 (Product string) |
S: |
序列号 (Serial number) |
C: |
配置描述符 (Configuration Descriptor) |
I: |
接口描述符 (Interface Descriptor) |
A: |
设备属性 (Attributes) |
M: |
制造商字符串 (Manufacturer string) |
E: |
端点描述符 (Endpoint Descriptor) |
* |
表示当前激活的配置或接口 |
T: Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=480 MxCh=12
D: Ver= 2.00 Cls=09(hub ) Sub=00 Prot=01 MxPS=64 #Cfgs= 1
P: Vendor=1d6b ProdID=0002 Rev=05.04
S: Manufacturer=Linux 5.4.0-91-generic xhci-hcd
S: Product=xHCI Host Controller
S: SerialNumber=0000:00:14.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
关键字段解释:
Bus=01:USB总线编号Lev=00:设备在拓扑中的层级(0表示根集线器)Spd=480:设备速度(单位Mbps)Vendor=1d6b:厂商ID(十六进制)ProdID=0002:产品ID(十六进制)Driver=hub:当前使用的驱动#Ifs=1:接口数量在Spd=字段中,数字代表不同的USB速度规格:
| 速度值 | 规格 | 说明 |
|---|---|---|
1.5 |
低速 (Low Speed) | USB 1.0/1.1,主要用于键盘、鼠标等 |
12 |
全速 (Full Speed) | USB 1.1,最大12Mbps |
480 |
高速 (High Speed) | USB 2.0,最大480Mbps |
5000 |
超高速 (SuperSpeed) | USB 3.0,最大5Gbps |
10000 |
超高速+ (SuperSpeed+) | USB 3.1 Gen2,最大10Gbps |
20000 |
超高速+ (SuperSpeed+) | USB 3.2,最大20Gbps |
查看所有USB设备信息:
sudo usb-devices
注意:普通用户也可以运行,但可能需要sudo才能看到完整信息。
查看普通用户权限下的信息:
usb-devices
使用grep筛选特定厂商的设备:
sudo usb-devices | grep -A10 -B2 "Vendor=8087"
查找特定产品ID的设备:
sudo usb-devices | grep -B5 "ProdID=0024"
只显示有问题的设备(无驱动):
sudo usb-devices | grep -B3 -A3 "Driver=(none)"
统计USB设备总数:
sudo usb-devices | grep "^T:" | wc -l
按速度统计设备数量:
sudo usb-devices | grep "Spd=" | sort | uniq -c
列出所有USB驱动:
sudo usb-devices | grep "Driver=" | sort -u
查看设备层级关系(拓扑结构):
sudo usb-devices | grep "^T:"
输出示例:
T: Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=480 MxCh=12
T: Bus=01 Lev=01 Prnt=01 Port=01 Cnt=01 Dev#= 2 Spd=480 MxCh= 0
T: Bus=01 Lev=01 Prnt=01 Port=02 Cnt=02 Dev#= 3 Spd=12 MxCh= 4
解析:
Lev=00:根集线器(第0层)Lev=01 Prnt=01:父设备是设备#1Lev=01 Prnt=01 Port=02:连接到父设备的端口2检测特定设备是否存在:
#!/bin/bash
VENDOR_ID="0x8087"
PRODUCT_ID="0x0024"
if sudo usb-devices | grep -q "Vendor=${VENDOR_ID#0x} ProdID=${PRODUCT_ID#0x}"; then
echo "设备已连接"
# 获取设备详细信息
DEVICE_INFO=$(sudo usb-devices | grep -B10 -A10 "Vendor=${VENDOR_ID#0x} ProdID=${PRODUCT_ID#0x}")
echo "$DEVICE_INFO"
else
echo "设备未连接"
fi
监控USB设备插拔事件(简化版):
#!/bin/bash
echo "开始监控USB设备变化..."
OLD_COUNT=$(sudo usb-devices | grep "^T:" | wc -l)
while true; do
NEW_COUNT=$(sudo usb-devices | grep "^T:" | wc -l)
if [ "$OLD_COUNT" -ne "$NEW_COUNT" ]; then
echo "USB设备数量变化: $OLD_COUNT -> $NEW_COUNT"
OLD_COUNT=$NEW_COUNT
# 显示新增设备
echo "当前USB设备列表:"
sudo usb-devices | grep "^T:"
fi
sleep 2
done
检查USB电源管理信息:
sudo usb-devices | grep -B2 -A2 "MxPwr="
查看设备配置描述符:
sudo usb-devices | grep -B3 "C: #Cfgs="
比较插拔前后的设备差异:
# 保存当前状态
sudo usb-devices > /tmp/usb_before.txt
# 插入/拔出设备后
sudo usb-devices > /tmp/usb_after.txt
# 比较差异
diff /tmp/usb_before.txt /tmp/usb_after.txt | grep -E "^[<>]"
grep -B5 -A5显示匹配行的前后内容grep -i忽略大小写搜索sort和uniq进行统计awk提取特定字段Driver=(none)的设备提取所有设备的厂商和产品ID:
sudo usb-devices | grep "Vendor=" | awk '{print $2, $3}' | sort -u
查看USB设备树状结构:
sudo usb-devices | awk '/^T:/ {
lev=$3; gsub(/Lev=/, "", lev);
prnt=$4; gsub(/Prnt=/, "", prnt);
port=$5; gsub(/Port=/, "", port);
printf "%" (lev*4) "s", "";
printf "└─ 设备#%s (父设备:%s, 端口:%s)\n", prnt, prnt, port;
}'
创建JSON格式的设备信息:
#!/bin/bash
echo "["
sudo usb-devices | awk '
BEGIN { first=1 }
/^T:/ {
if (!first) print " },"
first=0
split($0, arr, " ")
printf " {\n"
printf " \"bus\": \"%s\",\n", substr(arr[2], 5)
printf " \"level\": \"%s\",\n", substr(arr[3], 5)
printf " \"speed\": \"%s\",\n", substr(arr[7], 5)
}
/^D:/ && /Vendor=/ {
split($0, arr, " ")
for (i in arr) {
if (arr[i] ~ /^Vendor=/) {
split(arr[i], v, "=")
printf " \"vendor_id\": \"%s\",\n", v[2]
}
if (arr[i] ~ /^ProdID=/) {
split(arr[i], p, "=")
printf " \"product_id\": \"%s\",\n", p[2]
}
}
printf " \"driver\": \"%s\"\n", substr($NF, 8)
}
END {
if (!first) print " }"
print "]"
}' | grep -v "^$"
lsusb - 列出USB设备基本信息usbhid-dump - 转储USB HID设备数据usbview - 图形化USB设备查看器udevadm - 管理设备事件和属性dmesg - 查看内核消息(包含USB事件)lspci - 列出PCI设备lsblk - 列出块设备lscpu - 显示CPU信息lsmod - 显示已加载的模块dmesg - 显示内核环形缓冲区usb-devices 与 lsusb 的主要区别:
| 特性 | usb-devices |
lsusb |
|---|---|---|
| 信息详细程度 | 非常详细,显示所有描述符 | 相对简洁,基本信息 |
| 输出格式 | 固定格式,易于解析 | 可定制格式,支持多种选项 |
| 拓扑显示 | 清晰显示设备层级关系 | 需要-t参数显示拓扑 |
| 驱动信息 | 显示每个接口的驱动 | 不显示驱动信息 |
| 使用场景 | 设备调试、驱动开发 | 快速查看、日常使用 |
建议:
lsusb 或 lsusb -tusb-devicesusb-devices 显示的是内核USB子系统的信息,可能与实际物理连接有差异usb-devices可能对系统性能有轻微影响