Usb

從 USB wifi dongle 介面確定供應商:產品 ID

  • August 3, 2021

我正在開發一個 bash 腳本,該腳本可以自動將 USB wifi 加密狗添加到虛擬機(QEmu/KVM 虛擬化),從而將 wifi 密鑰添加到 VM。

$$ edit $$該虛擬機目前使用Debian Buster發行版$$ /edit $$ 從主機插入 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介面標識,其供應商:產品 ID 為2357:0109 ,並且是USB 匯流排**#2的設備#9。** *

當我們只知道介面的名稱時,如何確定供應商:產品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/device**,有:

模態:usb:v 2357 p 0109 d0101dc00dsc00dp00icFFiscFFipFFin00

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 ;sort -r用於在 MODEL 行之前對 VENDOR 行進行排序

因此,根據 udev @Tom Yan 的建議,列出所有帶有 vendor:product 的 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*” )並為每個路徑獲取並僅顯示介面名稱(迴聲 $ 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/ … )
  • 最後以正確的順序列印儲存的值 vendor:model ( 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 “[^/]+ $ " ) 所以 /sys/class/net/wlx123456789012 -> wlx123456789012,並顯示來自連結父文件夾的 idVendor 內容並對 idProduct 執行相同****操作

我剛剛將 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符號連結實際上在/sys/devices/...分支中執行,並且在 USB 控制器和設備之間有一層 ( 1-8)(在這種情況下沒有 USB 集線器)。該級別會包含任何有用的內容嗎?

# 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

引用自:https://unix.stackexchange.com/questions/662696