MAC-Adresse IP über Netzwerk
Ich hoffe, Sie sind alle gut.
Frage ich mich, ob Sie mir helfen könnte oder mich in die richtige Richtung. Ich arbeite derzeit an einem Projekt, das dreht sich um das Netzwerk-management. Wegen der starken zeitlichen Einschränkungen, wo möglich bin ich mit opensource-code. Das Problem das ich habe ist, dass ein Teil des Projekts erfordert es, dass ich in der Lage sein zu erfassen, die MAC-Adressen aller Geräte, die mit dem Netzwerk verbunden sind.
Mein wissen über Netzwerk-orientierter Programmierung ist begrenzt, da ich gearbeitet habe, auch in anderen Bereichen des software-Engineerings für die letzten 4 Jahre. Der Ansatz, den ich genommen habe ist die Verwendung von nmap als Grundlage, um die ip-Adresse und andere Informationen, die ich brauche. Die MAC-Adresse ist nicht enthalten in der nmap-out-put-und von dem, was ich gelesen habe, scheint es ein bisschen flakey. (ich könnte falsch sein).
Deshalb habe ich versucht, dies in einem zwei-Stufen-Ansatz, Erstens bekomme ich die Daten, darunter ip-Adresse, von nmap, welches einwandfrei funktioniert. Mein Nächster Schritt und das bit ich bin mir Schwierigkeiten mit ist ich die ping die ip-Adresse (von meinem python-Programm), die funktioniert. Aber wie bekomme ich die MAC-Adresse aus der IP-Adresse? Anfänglich dachte ich, die ping-ip und ergreifen Sie die MAC im ARP aber ich denke das wird nur funktionieren, wenn die IP-Adresse im selben Subnetz. das problem zusammengesetzte, über den Einsatz, es könnte bis zu 5000 Computer im Netzwerk protokolliert werden muss. Um Ihnen zu zeigen meine python-ping-Ansatz ist dies der code:
import pdb, os
import subprocess
import re
from subprocess import Popen, PIPE
# This will only work within the netmask of the machine the program is running on cross router MACs will be lost
ip ="192.168.0.4"
#PING to place target into system's ARP cache
process = subprocess.Popen(["ping", "-c","4", ip], stdout=subprocess.PIPE)
process.wait()
result = process.stdout.read()
print(result)
#MAC address from IP
pid = Popen(["arp", "-n", ip], stdout=PIPE)
s = pid.communicate()[0]
# [a-fA-F0-9] = find any character A-F, upper and lower case, as well as any number
# [a-fA-F0-9]{2} = find that twice in a row
# [a-fA-F0-9]{2}[:|\-] = followed by either a ?:? or a ?-? character (the backslash escapes the hyphen, since the # hyphen itself is a valid metacharacter for that type of expression; this tells the regex to look for the hyphen character, and ignore its role as an operator in this piece of the expression)
# [a-fA-F0-9]{2}[:|\-]? = make that final ?:? or ?-? character optional; since the last pair of characters won't be followed by anything, and we want them to be included, too; that's a chunk of 2 or 3 characters, so far
# ([a-fA-F0-9]{2}[:|\-]?){6} = find this type of chunk 6 times in a row
mac = re.search(r"([a-fA-F0-9]{2}[:|\-]?){6}", s).groups()[0] #LINUX VERSION ARP
mac = re.search(r"(([a-f\d]{1,2}\:){5}[a-f\d]{1,2})", s).groups()[0] #MAC VERSION ARP
print(mac)
Ich habe mir für einige Informationen, aber was ich gefunden habe, scheint ein bisschen vage. Falls Sie wissen irgendwelche Ideen oder Wege der Forschung, dass kann mir helfen, ich wäre dankbar
Cheers
Chris
- Ich würde gerne eines besseren belehrt, aber ich bezweifle, dass Sie werde in der Lage sein zu bekommen MAC-Adressen, die in anderen Subnetzen.
- ich Laufe ur obige code aber immer Fehler...
Traceback (most recent call last): File "Get_MacAddress_from_ip.py", line 26, in <module> mac = re.search(r"([a-fA-F0-9]{2}[:|\-]?){6}", s).groups()[0] AttributeError: 'NoneType' object has no attribute 'groups'
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht direkt die MAC-Adresse von einem Computer außerhalb Ihres Subnetzes.
Einer gemeinsamen Strategie für das Netzwerk-management-Anwendungen ist die Abfrage Maschinen, die tun diese Informationen haben, wie die Router und switches verbinden die Maschinen, mit SNMP. - Router arp-Tabellen, die für die Subnetze, zu denen Sie direkt verbunden sind (wie Sie dies benötigen, um Ihre Arbeit zu tun), und diese Informationen können erworben aus dem router.
Antworten auf diese Frage kann Hilfe bei der Suche nach python-Bibliothek, code-Hilfe in diesem Bestreben.
Dass Sie nicht die ursprüngliche MAC-Adresse des host, wenn Sie nicht mit dem gleichen Subnetz - würde man gerade mal die MAC-Adresse des letzten Routers.
Der einzige Weg, um alle MAC-Adressen wäre das einrichten eines Servers, um Sie zu fangen in jedem Subnetz, aber das scheint mir eine etwas verrückte Idee. Beachten Sie auch, dass es heutzutage sehr einfach, spoofing der MAC-Adresse, und es ist nicht zuverlässig bei allen.
Über alle, ich glaube, Sie sollten einen anderen Ansatz; zum Beispiel, es gibt viele Netzwerk-Inventar-Systeme, können Sie auch nur einen davon benutzen und das interface mit es.
Können Sie die Verwendung von python scapy Modul zu erhalten mac-Adresse