从 USB wifi dongle 接口确定供应商:产品 ID

从 USB wifi dongle 接口确定供应商:产品 ID

我正在开发一个 bash 脚本,该脚本可自动将 USB wifi 加密狗添加到虚拟机(QEmu/KVM 虚拟化),从而将 wifi 密钥添加到虚拟机。

[编辑]该虚拟机目前是Debian 巴斯特发行版[/编辑]

当我从主机插入 TP-Link TL-WN823N USB 加密狗时,会添加以下接口:

user@host:~$ ip -o link | grep wlx
57: wlx123456789012: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000\    link/ether 2a:51:d5:12:34:56 brd ff:ff:ff:ff:ff:ff

当我列出 USB 设备时,我得到:

user@host:~$ lsusb | grep TP-Link
Bus 002 Device 009: ID 2357:0109 TP-Link TL WN823N RTL8192EU

因此,它被识别为wlx123456789012接口,其vendor:product ID为2357:0109是设备#9USB总线的#2.*

当我们只知道接口名称时,如何确定供应商:产品ID?

@meuh建议

user@host:~$ ls --format=commas /sys/class/net/wlx123456789012/device
authorized, bAlternateSetting, bInterfaceClass, bInterfaceNumber,
bInterfaceProtocol, bInterfaceSubClass, bNumEndpoints, driver,
ep_01, ep_02, ep_03, ep_04, ep_05, ep_06, ep_81, ieee80211, leds,
modalias, net, power, subsystem, supports_autosuspend, uevent

所以不行小贩也不设备直接在这个位置文件(据他说,这是因为它的测试涉及板载wifi)

但这启发了我,所以我尝试了:

    user@host:~$ grep -iEr "2357|0109" /sys/class/net/wlx123456789012/device
...
/sys/class/net/wlx123456789012/device/modalias:usb:v2357p0109d0101dc00dsc00dp00icFFiscFFipFFin00
/sys/class/net/wlx123456789012/device/uevent:PRODUCT=2357/0109/101
/sys/class/net/wlx123456789012/device/uevent:MODALIAS=usb:v2357p0109d0101dc00dsc00dp00icFFiscFFipFFin00

所以在/sys/class/net/wlx123456789012/设备, 有 :

模式别名:usb:v2357p0109d0101dc00dsc00dp00icFFiscFFipFFin00

uevent:产品=2357/0109/101

所以我找到了痕迹,但 @meuh 给了我另一种本地化的事实让我怀疑解决方案(特别是如果我更改发行版的版本或仅更改发行版)

@Tom Yan 建议

user@host:~$ udevadm info /sys/class/net/wlx123456789012 \
 | sort -r | awk '/ID_(VENDOR|MODEL)_ID/'
E: ID_VENDOR_ID=2357
E: ID_MODEL_ID=0109

注意:这里使用 MODEL 代替 PRODUCT ;排序-r用于将 VENDOR 行排序在 MODEL 行之前

答案1

我刚刚将 Ralink RT5370 无线适配器插入 Debian 10 系统。

默认情况下,它显示为网络设备wlxc83a35c4a44b

您需要记住,这/sys/class/*基本上是一个目录子树,其叶子主要是指向分支的符号链接/sys/devices/*

# realpath /sys/class/net/wlxc83a35c4a44b
/sys/devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0/net/wlxc83a35c4a44b
# realpath /sys/class/net/wlxc83a35c4a44b/device
/sys/devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0

因此,device符号链接实际上在分支内运行,并且USB 控制器和设备(在本例中没有 USB 集线器)之间/sys/devices/...存在一层 ( )。1-8该级别包含任何有用的东西吗?

# ls --format=commas /sys/devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0/..
1-8:1.0/, ep_00/, power/, authorized, avoid_reset_quirk, bcdDevice,
bConfigurationValue, bDeviceClass, bDeviceProtocol, bDeviceSubClass,
bmAttributes, bMaxPacketSize0, bMaxPower, bNumConfigurations, bNumInterfaces,
busnum, configuration, descriptors, dev, devnum, devpath, driver@,
firmware_node@, idProduct, idVendor, ltm_capable, manufacturer, maxchild, port@,
product, quirks, removable, remove, rx_lanes, serial, speed, subsystem@,
tx_lanes, uevent, urbnum, version

idProductidVendor。我们可以只通过网络设备名称来访问它们吗?

# cat /sys/class/net/wlxc83a35c4a44b/device/../idProduct
5370
# cat /sys/class/net/wlxc83a35c4a44b/device/../idVendor
148f

让我们验证它是正确的设备:

# lsusb -d 148f:5370
Bus 001 Device 014: ID 148f:5370 Ralink Technology, Corp. RT5370 Wireless Adapter

看来是正确的。

它也可以在没有 root 的情况下工作,并且在中间添加 USB 集线器:

$ realpath /sys/class/net/wlxc83a35c4a44b/device
/sys/devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7.2/1-7.2:1.0
$ cat /sys/class/net/wlxc83a35c4a44b/device/../idVendor
148f
$ cat /sys/class/net/wlxc83a35c4a44b/device/../idProduct
5370

答案2

因此,根据 udev @Tom Yan 的建议,要列出所有具有供应商:产品的 Wifi USB 适配器接口,我建议:

user@host:~$ for i in $( find /sys/class -name "wlx*" ) ; do \
 echo "$( echo $i | grep -oE "[^/]+$" ) $( \
  udevadm info $i \
  | awk '\
   function get_val () { split ( $0 , a , "=" ) ; return a [ 2 ] } \
   /ID_VENDOR_ID/ { v = get_val() } \
   /ID_MODEL_ID/ { m = get_val() } \
   END { print v ":" m }\
  ' \
 )" ; \
done
wlx123456789012 2357:0109

说明:对于每个接口(for i in ...; do ...; done),列出所有 wifi USB 加密狗接口路径(find /sys/class -name "wlx*")并且对于每个路径获取并仅显示接口名称(echo $i | grep -oE "[^/]+$" )所以 /sys/class/net/wlx123456789012 -> wlx123456789012,获取所有 udev 属性并过滤这些属性(udevadm info $i | awk ...)。

过滤过程:

  • 创建一个函数,将当前记录($0)除以相等的字符(“=”),并将结果存储在“a”数组中,并返回“a”的第二个成员,因此ID值(函数get_val)

  • 过滤并存储值( /ID_VENDOR_ID/ ... 和 /ID_MODEL_ID/ ... )

  • 最后以正确的顺序打印存储的值供应商:模型(END {...})


并基于@telcoM更多与系统无关且简单的方法:

user@host:~$ for i in $( find /sys/class/net/ -type l -name "wlx*" ) ; do \
 echo "$( \
  echo $i | grep -oE "[^/]+$" \
 ) $( \
  cat $i/device/../idVendor \
 ):$( \
  cat $i/device/../idProduct \
 )" ; \
done
wlx123456789012 2357:0109

说明:对于每个接口( for i in ... ; do ... ; done ),列出所有 wifi USB 适配器接口链接( find /sys/class/net -type l -name "wlx*" )和每个链接仅获取并显示接口名称( echo $i | grep -oE "[^/]+$" )so /sys/class/net/wlx123456789012 -> wlx123456789012,并显示供应商ID链接父文件夹中的内容并执行相同的操作产品编号

相关内容