저는 USB Wi-Fi 동글과 Wi-Fi 키를 가상 머신(QEmu/KVM 가상화)에 자동으로 추가하는 bash 스크립트를 작업 중입니다.
[편집] 가상 머신은 현재데비안 버스터출시 버전[/편집]
호스트 컴퓨터에서 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장비입니다#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
그래서 아니야행상인...도 아니다장비파일을 이 위치에 직접 저장합니다(그에 따르면 이는 테스트에 온보드 Wi-Fi가 포함되어 있기 때문이라고 합니다).
하지만 그것이 나에게 영감을 주었기 때문에 다음과 같이 시도해 보았습니다.
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:v2357피0109d0101dc00dsc00dp00icFFiscFFipFFin00
ueevent:제품=2357/0109/101
그래서 추적을 찾았는데 @meuh가 또 다른 현지화를 제공했다는 사실이 해결책을 의심하게 만듭니다(특히 distro 버전을 변경하거나 distro만 변경하는 경우).
@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
참고: 여기서는 PRODUCT 대신 MODEL이 사용됩니다.정렬 -rMODEL 행보다 먼저 VENDOR 행을 정렬하는 데 사용됩니다.
답변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
심볼릭 링크는 실제로 분기 내에서 실행되며 /sys/devices/...
USB 컨트롤러와 장치 사이에 레이어( )가 있습니다(이 경우 USB 허브가 없음). 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
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
맞는 것 같습니다.
또한 루트 없이도 작동하며 중간에 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이 제안한 대로 모든 Wi-Fi USB 어댑터 인터페이스를 Vendor: 제품과 함께 나열하려면 다음을 제안합니다.
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)에 대해 모든 Wi-Fi USB 동글 인터페이스 경로를 나열하고(/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/ ... )
마지막으로 저장된 값을 올바른 순서로 인쇄합니다. Supply: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 )에 대해 모든 Wi-Fi USB 어댑터 인터페이스 링크( find /sys/class/net -type l -name "wlx*" )와 각 링크만 나열합니다. 인터페이스 이름( echo $i | grep -oE "[^/]+$" )을 가져오고 표시하므로 /sys/class/net/wlx123456789012 -> wlx123456789012를 표시하고공급업체 ID상위 폴더의 콘텐츠를 연결하고 동일한 작업을 수행합니다.제품 번호