有没有办法列出我的 WiFi 接入点上已连接的设备?

有没有办法列出我的 WiFi 接入点上已连接的设备?

我有一个 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

iwconfigiwgetidiwpriviwspy也出现在 中/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- 此变量表示需要更新文件(如果需要)。

相关内容