2016-07-04 15 views
2

Ich habe ein Gerät in meinem lokalen Netzwerk und kenne seine MAC-Adresse. Es bekommt seine IP-Adresse automatisch über DHCP. Ich möchte diese IP erhalten.IP-Adresse von MAC mit Python erhalten

Ich möchte nmap nicht verwenden, aber scapy wäre in Ordnung, da ich aus einer Kivy App importiere.

ich gefunden:

from scapy.all import srp, Ether, ARP 
ans,unans=srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst="192.168.1.0/24"),timeout=2) 

und mit

ans.summary() 

ich folgende Ausgabe:

Ether/ARP who has 192.168.43.1 says 192.168.43.92 ==> Ether/ARP is at 3e:f8:d9:45:1b:3d says 192.168.43.1 

Meine beiden Probleme sind:

1: Ich habe Führe das Skript mit sudo pyth aus auf und ich bin mir nicht sicher über die Freizügigkeit in Kivy.

2: Gibt es einen einfachen Weg, die Variablen für IP/MAC aus der .summary() zu bekommen?

Antwort

3

Ja, können Sie das tun scapy verwenden. Hier ist ein Beispiel eines ARP-at-Paket:

###[ Ethernet ]### 
    dst= 08:00:27:fa:25:8e 
    src= 08:00:27:b1:af:68 
    type= 0x806 
    ###[ ARP ]### 
    hwtype= 0x1 
    ptype= 0x800 
    hwlen= 6 
    plen= 4 
    op= is-at 
    hwsrc= 08:00:27:b1:af:68 
    psrc= 192.168.56.102 
    hwdst= 08:00:27:fa:25:8e 
    pdst= 192.168.56.101 
     ###[ Padding ]### 
      load= '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00' 

Sie die hwsrc und psrc Werte einer Variablen wie diese

srcMAC = pkt[ARP].hwsrc 
srcIP = pkt[ARP].psrc 

oder drucken Sie sie wie folgt

print pkt[ARP].hwsrc 
print pkt[ARP].psrc 
zuweisen

Hoffe, dass hilft.

+0

Danke! Das hat für mich funktioniert. Nice :) –

+0

Leider kann ich Ihre Antwort nicht aufwerten. Ich habe wenig Ansehen: D –

0

Wenn die Struktur der Zusammenfassung immer gleich ist (was ich annehmen), dann könnten Sie import re und verwenden Sie eine Regex, um die IP-Adresse zu extrahieren.

re.sub(r'.* says (.*) ==> Ether/ARP is.*', r'\1', ans.summary()) 

Das funktioniert für mich:

Sollte so etwas wie

>>> import re 
>>> x = "Ether/ARP who has 192.168.43.1 says 192.168.43.92 ==> Ether/ARP is at 3e:f8:d9:45:1b:3d says 192.168.43.1" 
>>> re.sub(r'.* says (.*) ==> Ether/ARP is.*', r'\1', x) 
'192.168.43.92' 
+0

Vielen Dank! Ich versuchte das, aber ans.summary() gibt keine Zeichenfolge oder einen Puffer zurück: –

+0

Traceback (letzter Anruf zuletzt): Datei "", Zeile 1, in re (r '. * Sagt (. *) ==> Ether/ARP ist. * ', R' \ 1 ', ans.summary()) Datei "/usr/lib/python2.7/re.py", Zeile 155, in Unter- return _compile (Muster, Flags) .sub (repl, string, count) TypeError: erwartete Zeichenfolge oder Puffer –

+0

Welcher Datentyp ist ans.summary()? – fuuman