パイソンを使用してデバイスからMACアドレスを取得
-
20-09-2019 - |
質問
私は自分のローカルネットワーク上のデバイスからlayer II
アドレスを取得する(のpythonで)方法を探しています。 Layer III
アドレスが知られています。
の目標は、彼らが持っている場合は、MACアドレスが自分自身に、電子メールアラートを変更していないことを保証し、定期的にIPアドレスのデータベースをポーリングするスクリプトを構築することです。
解決
はPythonとの質問に答えるために、ご使用のプラットフォームに依存します。私は、Windowsが手元にないので、次のソリューションは、私がそれを書いたのLinuxボックス上で動作します。正規表現に小さな変化が、それはOS Xで動作するようになります。
まず、あなたはターゲットをpingしなければなりません。これは、ターゲットを配置します - 限り、それはそれはそれはになります。このような状況でのように聞こえるあなたのネットマスク、内だとして - システムのARPキャッシュに。観察します:
13:40 jsmith@undertow% 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 jsmith@undertow% 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"
他のヒント
のが長すぎない答え同様の質問がありました前にこのサイト上で。その質問のアスカーによって選ばれた解答で述べたように、Pythonはそれを行うには、組み込みの方法はありません。あなたは Scapy
の編集のウェブサイトからScapy 使用例>
ここではその意志別のツールであります 常に上のすべてのインターフェイスを監視します 機械や印刷のすべてのARP要求、それ でもからの802.11フレームに、見ています モニタモードでのWi-Fiカード。注意 回避するスニフにストア= 0パラメータ() メモリ内のすべてのパケットを格納します 何もない。
#! /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)
未まさにあなたが探している、間違いなく正しい軌道に乗って。お楽しみください!
あなたがARPスプーファを監視するような音?この場合は、あなたが必要とするすべては arpwatchのに、お近くのあらゆるよく提供するLinuxディストリビューションで利用可能です。ここでのダウンロードソース: http://ee.lbl.gov/する
のUNIXベースのシステムのために:
#!/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)
マックとのタプルのリストを返します。 scapyは素晴らしいツールですが、この場合のためにやり過ぎのようです。
Linuxの場合は、あなたが "ARP" utilのコマンドラインを欠場sometimems。例えば、ベースyocto Linuxの組み込み環境の画像。
「ARP」ツールのない別の方法は、ファイルは/ proc /ネット/ arpコマンドを読み、解析するようになります:
root@raspberrypi:~# 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
簡単な方法、Linuxの場合:
print os.system('arp -n ' + str(remoteIP))
あなたが取得します。
Address HWtype HWaddress Flags Mask Iface
192.168..... ether 9B:39:15:f2:45:51 C wlan0
192.168.0.0/24サブネットをスキャンするために、scapyを用いた簡単な解決策は、ある
from scapy.all import *
ans,unans = arping("192.168.0.0/24", verbose=0)
for s,r in ans:
print("{} {}".format(r[Ether].src,s[ARP].pdst))
ここで見つけるnetifacesを使用してみてください。 netifacesする
はPython 3.7のための一般的な更新。備考:Linuxベースのシステムのための一定の答えを提供するよう-n
のオプションarp
は、Windowsシステム上のARPリストを提供していません。ここでの回答で述べたように、オプション-a
を使用してください。
from subprocess import Popen, PIPE
pid = Popen(['arp', '-a', ip], stdout=PIPE, stderr=PIPE)
IP, MAC, var = ((pid.communicate()[0].decode('utf-8').split('Type\r\n'))[1]).split(' ')
IP = IP.strip(' ')
MAC = MAC.strip(' ')
if ip == IP:
print ('Remote Host : %s\n MAC : %s' % (IP, MAC))