![有没有办法列出我的 WiFi 接入点上已连接的设备?](https://linux22.com/image/23266/%E6%9C%89%E6%B2%A1%E6%9C%89%E5%8A%9E%E6%B3%95%E5%88%97%E5%87%BA%E6%88%91%E7%9A%84%20WiFi%20%E6%8E%A5%E5%85%A5%E7%82%B9%E4%B8%8A%E5%B7%B2%E8%BF%9E%E6%8E%A5%E7%9A%84%E8%AE%BE%E5%A4%87%EF%BC%9F.png)
我有一个 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”作为 root:
$ 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 - 第二个将覆盖第一个)。
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
- 此变量表示需要更新文件(如果需要)。