從 USB wifi dongle 介面確定供應商:產品 ID
我正在開發一個 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
有
idProduct
和idVendor
。我們可以僅通過網路設備名稱訪問它們嗎?# 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