Erhalten Sie MAC-Adresse von Geräten mit Python
-
20-09-2019 - |
Frage
Ich bin auf der Suche nach einem Weg (mit Python) die layer II
-Adresse von einem Gerät auf meinem lokalen Netzwerk zu erhalten. Layer III
Adressen sind bekannt.
Das Ziel ist es, ein Skript zu erstellen, die eine Datenbank von IP-Adressen in regelmäßigen Abständen abfragt sichergestellt wird, dass die MAC-Adressen nicht geändert haben und wenn sie haben, E-Mail-Benachrichtigungen zu mir selbst.
Lösung
Zur Beantwortung der Frage mit Python auf Ihrer Plattform abhängt. Ich habe nicht von Windows handlich, so dass die folgende Lösung funktioniert auf dem Linux-Box Ich schrieb es auf. Eine kleine Änderung des regulären Ausdrucks wird es in OS X zu arbeiten.
Zunächst müssen Sie das Ziel pingen. Das wird das Ziel setzen - solange es in Ihrem netmask ist, die es in dieser Situation klingt es sein wird - in Ihrem System ARP-Cache. Beachten Sie:
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
Zu wissen, dass Sie ein wenig zu subprocess Magie - sonst gerade schreiben Sie ARP-Cache-Code überprüft sich selbst, und Sie wollen nicht, das zu tun:
>>> 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"
Andere Tipps
Es gab eine ähnliche Frage nicht zu beantworten langen vor auf dieser Seite. Wie in der durch die Fragesteller dieser Frage gewählte Antwort erwähnt, Python hat keine integrierte Möglichkeit, es zu tun. Sie müssen entweder einen Systembefehl wie arp
rufen ARP Informationen zu erhalten, oder Ihre eigenen Pakete erzeugen mit scapy .
Edit: ein Beispiel unter Verwendung scapy von ihrer Website
Hier ist ein weiteres Werkzeug, dass Wille überwacht ständig alle Schnittstellen auf einem Maschine und alle ARP-Anfrage ausdrucken sieht, auch auf 802.11 Frames von einem Wi-Fi-Karte im Monitor-Modus. Beachten Sie das store = 0 Parameter sniff () zu vermeiden Speichern aller Pakete im Speicher für nichts.
#! /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)
Nicht genau das, was Sie suchen, aber auf jeden Fall auf dem richtigen Weg. Genießen Sie!
Sounds wie Sie ARP spoofers überwachen möchten? In diesem Fall ist alles was Sie brauchen arpwatch , in der Nähe von Ihnen in jeder gut versorgten Linux-Distribution verfügbar . Download-Quellen hier: http://ee.lbl.gov/
für Unix-basierte Systeme:
#!/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)
kehrt Liste von Tupeln mit macs. scapy ist ein wunderbares Werkzeug, scheint aber für diesen Fall zu sein Overkill
In Linux sometimems Sie die Befehlszeile util "arp" verpassen. Eine Basis yocto Embedded Linux-Umgebung Bild zum Beispiel.
Eine andere Möglichkeit, ohne das "arp" Werkzeug wäre die Datei / proc / net / arp zu lesen und analysieren:
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
ein einfacher Weg, wenn auf Linux:
print os.system('arp -n ' + str(remoteIP))
Sie erhalten:
Address HWtype HWaddress Flags Mask Iface
192.168..... ether 9B:39:15:f2:45:51 C wlan0
Eine einfache Lösung mit scapy, scannen das 192.168.0.0/24 Subnetz ist wie folgt:
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))
Versuchen Sie, die netifaces mit hier. netifaces
Allgemeine Update für Python 3.7. Anmerkung: Die Option -n
für arp
nicht die arp-Liste auf Windows-Systemen bereitstellt, wie mit bestimmten Antworten für Linux-basierte Systeme zur Verfügung gestellt. Verwenden Sie die Option -a
wie hier in der Antwort angegeben.
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))