2009-11-17 77 views
14

ローカルネットワーク上のデバイスからレイヤIIアドレスを取得する方法(Pythonを使用)を探しています。第III層アドレスは既知である。Pythonを使用してデバイスからMACアドレスを取得

目標は、定期的にIPアドレスのデータベースをポーリングするスクリプトを作成して、MACアドレスが変更されていないことを確認し、それがある場合はアラートを自分宛てに送信することです。

+0

彼はローカルマシン上のものをチェックしていない、無償ARPを避けています。慎重に質問を読んでください:**私のローカルネットワーク上のデバイスから** –

答えて

14

Pythonの質問に答えるには、プラットフォームによって異なります。私は便利なWindowsを持っていないので、以下の解決策は、私が書いたLinuxボックスで動作します。正規表現を少し変更すると、OS Xで動作するようになります。

まず、ターゲットにpingを実行する必要があります。それはターゲットを配置します - ネットマスク内にある限り、システムのARPキャッシュにこのような状況のように聞こえるでしょう。お守り:

13:40 [email protected]% ping 97.107.138.15 
PING 97.107.138.15 (97.107.138.15) 56(84) bytes of data. 
64 bytes from 97.107.138.15: icmp_seq=1 ttl=64 time=1.25 ms 
^C 

13:40 [email protected]% arp -n 97.107.138.15 
Address     HWtype HWaddress   Flags Mask   Iface 
97.107.138.15   ether fe:fd:61:6b:8a:0f C      eth0 

は、あなたが少しサブプロセスの魔法を行う、ことを知って - そうでなければ、コードを自分でチェックするARPキャッシュを書いている、とあなたがそれを行うにはしたくない:

>>> from subprocess import Popen, PIPE 
>>> import re 
>>> IP = "1.2.3.4" 

>>> # do_ping(IP) 
>>> # The time between ping and arp check must be small, as ARP may not cache long 

>>> pid = Popen(["arp", "-n", IP], stdout=PIPE) 
>>> s = pid.communicate()[0] 
>>> mac = re.search(r"(([a-f\d]{1,2}\:){5}[a-f\d]{1,2})", s).groups()[0] 
>>> mac 
"fe:fd:61:6b:8a:0f" 
+2

ハ、それはまさに私が執筆の途中だった答えです! –

+0

OpenWRTにはないarpがあり、OpenWRTにインストール可能なip-neighborパッケージを持っていれば、このコマンドを使って 'pid'の値を得ることができます: ' pid = Popen (["ip"、 "neigh"、 "show"、IP]、stdout = PIPE) ' –

2

あなたはARPスプーファーを監視したいのですか?この場合、必要なのはarpwatchで、十分に用意されているLinuxディストリビューションで利用できます。ソースをここにダウンロードしてください:http://ee.lbl.gov/

3

similar questionがこのサイトにあまりにもずっと前に答え​​ました。その質問の質問者が選択した答えで述べたように、Pythonには組み込みの方法がありません。 ARP情報を取得するには、arpなどのシステムコマンドを呼び出すか、Scapyを使用して独自のパケットを生成する必要があります。

編集:Scapy from their websiteを使用して例:

ここでは 絶えずそれ もAからの802.11フレームに、見ているすべてのARP要求 機と印刷上のすべてのインターフェイスを監視する別のツールであります モニタモードのWi-Fiカード。 がすべてのパケットをメモリに格納しないようにするには、 のstore = 0パラメータをsniff()に書き込むことに注意してください。あなたが探している未まさに

#! /usr/bin/env python 
from scapy import * 

def arp_monitor_callback(pkt): 
    if ARP in pkt and pkt[ARP].op in (1,2): #who-has or is-at 
     return pkt.sprintf("%ARP.hwsrc% %ARP.psrc%") 

sniff(prn=arp_monitor_callback, filter="arp", store=0) 

、間違いなく正しい軌道に乗って。楽しい!

0

を使用してみてくださいここで見つかったネットスペース。 UNIXベースのシステム用netifaces

1

#!/usr/bin/env python2.7 

import re 
import subprocess 
arp_out =subprocess.check_output(['arp','-lan']) 

re.findall(r"((\w{2,2}\:{0,1}){6})",arp_out) 

はMacにタプルのリストを返します。 scapyはすばらしいツールですが、このケースでは過剰なようです。

1

Linuxでは、コマンドラインユーティリティ "arp"がありません。例えば、yocto linux組み込み環境イメージ。

"ARP" ツールのない別の方法は、ファイルは/ proc /ネット/ ARP読み、解析するようになります:Linuxの場合、

[email protected]:~# cat /proc/net/arp 
IP address  HW type  Flags  HW address   Mask  Device 
192.168.1.1  0x1   0x2   xx:xx:xx:xx:xx:xx  *  wlan0 
192.168.1.33  0x1   0x2   yy:yy:yy:yy:yy:yy  *  wlan0 
0

に簡単な方法を:

print os.system('arp -n ' + str(remoteIP))

あなたが取得します:

Address  HWtype HWaddress   Flags Mask   Iface 
    192.168..... ether 9B:39:15:f2:45:51 C      wlan0 
関連する問題