ローカルネットワーク上のデバイスからレイヤIIアドレスを取得する方法(Pythonを使用)を探しています。第III層アドレスは既知である。Pythonを使用してデバイスからMACアドレスを取得
目標は、定期的にIPアドレスのデータベースをポーリングするスクリプトを作成して、MACアドレスが変更されていないことを確認し、それがある場合はアラートを自分宛てに送信することです。
ローカルネットワーク上のデバイスからレイヤIIアドレスを取得する方法(Pythonを使用)を探しています。第III層アドレスは既知である。Pythonを使用してデバイスからMACアドレスを取得
目標は、定期的にIPアドレスのデータベースをポーリングするスクリプトを作成して、MACアドレスが変更されていないことを確認し、それがある場合はアラートを自分宛てに送信することです。
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"
ハ、それはまさに私が執筆の途中だった答えです! –
OpenWRTにはないarpがあり、OpenWRTにインストール可能なip-neighborパッケージを持っていれば、このコマンドを使って 'pid'の値を得ることができます: ' pid = Popen (["ip"、 "neigh"、 "show"、IP]、stdout = PIPE) ' –
あなたはARPスプーファーを監視したいのですか?この場合、必要なのはarpwatchで、十分に用意されているLinuxディストリビューションで利用できます。ソースをここにダウンロードしてください:http://ee.lbl.gov/
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)
、間違いなく正しい軌道に乗って。楽しい!
を使用してみてくださいここで見つかったネットスペース。 UNIXベースのシステム用netifaces
:
#!/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はすばらしいツールですが、このケースでは過剰なようです。
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
に簡単な方法を:
print os.system('arp -n ' + str(remoteIP))
あなたが取得します:
Address HWtype HWaddress Flags Mask Iface
192.168..... ether 9B:39:15:f2:45:51 C wlan0
彼はローカルマシン上のものをチェックしていない、無償ARPを避けています。慎重に質問を読んでください:**私のローカルネットワーク上のデバイスから** –