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.

War es hilfreich?

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))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top