私のWiFiアクセスポイントに接続されているデバイスを一覧表示する方法はありますか?

私のWiFiアクセスポイントに接続されているデバイスを一覧表示する方法はありますか?

アクセスポイントとして動作するAngstrom Linuxデバイスがありhostapdますdhcpd。 Wi-Fiに接続されているデバイスのリストを取得できますか? DHCPリースを取得できることを知っていますが、どのデバイスがそれを通過するかを知る必要がありますwlan0iwlistオプションを含む)。

iwlist wlan0 ap
iwlist wlan0 accesspoints
iwlist wlan0 peers

しかし、すべてが返されます。

wlan0     Interface doesn't have a list of Peers/Access-Points

iwconfig、にも表示されますが、クライアントiwgetidのリストを表示するオプションはないようです。iwpriviwspy/sbin

答え1

使用する必要がありますiw dev wlan0 station dumprootユーザーとして

答え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を持つことはできません。2番目の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.txtMS Windowsの行末がある可能性があるためです。

gsub(/.*\t+/,"")- タグを削除

macnamz[mac]=$0- 行を配列メンバーに変換します。

update=1- この変数は、ファイルを更新する必要があることを示します(必要な場合)。

関連情報