
액세스 포인트로 실행되는 Angstrom Linux 장치가 있는데 hostapd
제대로 dhcpd
작동합니다. Wi-Fi에 연결된 장치 목록을 얻을 수 있나요? DHCP 임대를 얻을 수 있다는 것을 알고 있지만 어떤 장치가 이를 통과하는지 알아야 합니다 wlan0
( iwlist
옵션 포함).
iwlist wlan0 ap
iwlist wlan0 accesspoints
iwlist wlan0 peers
하지만 모두 반환됩니다.
wlan0 Interface doesn't have a list of Peers/Access-Points
iwconfig
, iwgetid
및 iwpriv
에도 iwspy
표시되지만 /sbin
클라이언트 목록을 표시하는 옵션은 없는 것 같습니다.
답변1
당신은 사용해야합니다iw dev wlan0 station dump
루트 사용자로
답변2
"arp"를 루트로 사용할 수 있습니다.
$ sudo arp
또는:
$ sudo arp | sort
좀 좋은데 요점을 알겠습니다 :)
답변3
다음 명령을 사용하여 AP에 연결된 장치 목록을 찾을 수도 있습니다.
cat /var/lib/misc/dnsmasq.leases
dnsmasq.leases 파일에는 지금까지 AP에 연결된 모든 장치가 나열됩니다. 다음 명령을 사용하여 WiFi 또는 이더넷을 통해 장치에 연결된 모든 장치 목록을 가져올 수도 있습니다.
sudo arp
답변4
나는 다음과 같은 빠른 솔루션을 사용합니다.
awk '$4~/[1-9a-f]+/&&$6~/^wl/{print "ip: "$1" mac: "$4}' /proc/net/arp
필터는 목록에서 /[1-9a-f]/
MAC 주소를 제거합니다 .00:00:00...
이 /^wl/
필터는 무선이 아닌 인터페이스(처음에 "wl"이 없는 이름)를 모두 제거합니다.
예시 결과는 다음과 같습니다.
ip: 192.168.0.1 mac: 64:6e:ea:d1:d3:0a
ip: 192.168.0.2 mac: a0:d3:a1:6d:d0:4a
macs
또한 편의상 이 컨텍스트에 대한 MAC 주소 목록이 포함된 파일을 사용했습니다.
90:94:97:9f:85:10 My Huawei
64:6e:ea:d1:d3:0a Rostelecom Router
이 파일을 구문 분석하여 연결된 장치 목록을 얻으려면 다음과 같은 명령을 사용합니다(END 부분은 필요하지 않습니다. 이는 업데이트 프로그램입니다).
awk 'BEGIN{while((getline<"macs")>0){nmm=$0;gsub($1" ","",nmm);nmz[$1]=nmm}}$4~/[1-9a-f]+/&&$6~/^wl/{print $1 " " (nmz[$4]?nmz[$4]:$4);if(!nmz[$4]){nmz[$4]=$4;update=1}}END{if(update){system("gawk -f macupd.awk")}}' /proc/net/arp
결과는 다음과 같습니다.
192.168.0.1 Rostelecom Router
192.168.0.74 My Huawei
이것은 macupd.awk
파일을 업데이트하는 데 사용되는 스크립트입니다 macs
. 파일에서 공급업체 이름을 가져옵니다.oui.txt(동일한 디렉터리에 있음) 이를 컴퓨터에 연결된 알 수 없는 호스트/클라이언트에 대한 설명으로 사용하고 macs
목록 파일에 기록합니다(명령에서 END 부분을 제거하여 이 기능을 비활성화할 수 있습니다). 스크립트는 다음과 같습니다.
#!/usr/bin/gawk -f
BEGIN{
while((getline<"macs")>0){
str++
if($0!~"(^#|^$)"){
nam=$0
gsub($1" ","",nam)
macnamz[$1]=nam
}
}
while((getline<"/proc/net/arp")>0){
if($4~/[1-9a-f]+/&&$6~/^wl/){
if(!macnamz[$4]){
mac=macv=$4
gsub(":","",macv)
vendor=substr(macv,1,6)
rs=RS
RS="\n|\r"
while((getline<"oui.txt")>0){
if(toupper($1)~toupper(vendor)){gsub(/.*\t+/,"");macnamz[mac]=$0;update=1}
}
RS=rs
}
}
}
if(update){
for(i in macnamz){print i " " macnamz[i] > "macs"}
print "" > "macs"
}
}
그렇다면 만약에첫 번째불완전한 명령을 실행하면 결과는 다음과 같습니다(모든 호스트를 알 수 없는 경우).
192.168.10.1 00:d0:ef:aa:ee:ff
192.168.10.2 f4:bd:9e:00:00:00
192.168.10.3 00:22:72:11:22:33
이것두번째작업은 다음과 같습니다.
192.168.10.1 IGT
192.168.10.2 Cisco Systems, Inc
192.168.10.3 American Micro-Fuel Device Corp.
내 스크립트에 대한 설명입니다.
getline<"macs"
- 목록에서 행 읽기
if($0!~"(^#|^$)")
- 주석 라인과 빈 라인을 무시합니다.
gsub($1" ","",nam)
- 설명을 위해 변수를 사용합니다 nam
(공백 뒤의 모든 내용).
macnamz[$1]=nam
- 마지막으로 행을 연관 배열의 일부로 변환합니다(2개의 중복 MAC을 가질 수 없습니다. 두 번째 MAC이 첫 번째 MAC을 덮어씁니다).
getline<"/proc/net/arp"
- 연결의 IP와 MAC을 가져옵니다.
if($4~/[1-9a-f]+/&&$6~/^wl/)
- 헤더 라인, MAC 제로 및 비무선 인터페이스를 필터링합니다.
if(!macnamz[$4])
- 연결된 장치가 macs
당사 파일에 등록되어 있지 않은 경우.
gsub(":","",macv)
vendor=substr(macv,1,6)
-MAC의 처음 6개 기호를 가져옵니다 .
RS="\n|\r"
- oui.txt
MS Windows 줄 끝이 있을 수 있기 때문입니다.
gsub(/.*\t+/,"")
- 태그 삭제
macnamz[mac]=$0
- 행을 배열 멤버로 변환합니다.
update=1
- 이 변수는 파일을 업데이트해야 함을 나타냅니다(필요한 경우).