ネットワーク上の特定の MAC アドレスをすべて Python スクリプト内から検索したいと考えています。ネットワーク内のすべてのアクティブな IP アドレスのマップを既に持っていますが、MAC アドレスを収集する方法がわかりません。何か案は?
8 に答える
Python自体からそれを取得する組み込みの方法はないと思います。
私の質問は、ネットワークから IP 情報をどのように取得していますか?
ローカル マシンから取得するには、ほとんど問題なく ifconfig (unix) または ipconfig (windows) を解析できます。
純粋な Python ソリューションが必要な場合は、Scapyを見てパケットを作成できます (ARP 要求を送信し、応答を検査する必要があります)。または、外部プログラムの呼び出しを気にしない場合は、使用できますarping
(Un*x システムでは、Windows に相当するものは知りません)。
Python でこれを行うネイティブな方法はないようです。Windows では「ipconfig /all」、Linux では「ifconfig」の出力を解析することをお勧めします。いくつかの正規表現で os.popen() を使用することを検討してください。
プラットフォームによって異なります。*nix を使用している場合は、「arp」コマンドを使用して、特定の IP (IPv4 を想定) アドレスの MAC アドレスを検索できます。それが機能しない場合は、アドレスに ping を実行して確認するか、(BPF またはその他のメカニズムを使用して) 生のネットワークにアクセスできる場合は、独自の ARP パケットを送信できます (ただし、これはおそらくやり過ぎです)。
「arp」の出力を解析する必要がありますが、カーネル ARP キャッシュには、それらのホストが Python スクリプトが実行されているホストと通信した場合にのみ、それらの IP アドレスが含まれます。
ifconfig を使用して、ローカル インターフェイスの MAC アドレスを表示できますが、LAN 上の MAC アドレスは表示できません。
Mark Pilgrim は、現在のマシンで Netbios モジュールを使用して Windows でこれを行う方法について説明しています。Netbios モジュールは、python.org で入手できる Win32 パッケージの一部として入手できます。残念ながら、現時点ではモジュールのドキュメントが見つかりません。
Python は OS 固有の問題に対処することを意図していないため (解釈され、クロスプラットフォームであることが想定されています)、外部コマンドを実行してそうします。
UNIX では、コマンドは次のとおりです。ifconfig
パイプとして実行すると、目的の結果が得られます。
import os
myPipe = os.popen2("/sbin/ifconfig","a")
print(myPipe[1].read())