2009-11-17 5 views
14

Je cherche un moyen (avec python) d'obtenir l'adresse de couche II à partir d'un périphérique sur mon réseau local. Les adresses de couche III sont connues.Obtenir l'adresse MAC à partir de périphériques utilisant Python

L'objectif est de construire un script qui interrogera des bases de données d'adresses IP à intervalles réguliers en s'assurant que les adresses mac n'ont pas changé et si elles ont, des alertes par e-mail à moi-même.

+0

Il évite ARP gratuit, ne pas vérifier des choses sur la machine locale. Lisez la question attentivement: ** à partir d'un appareil sur mon réseau local ** –

Répondre

14

Pour répondre à la question avec Python dépend de votre plate-forme. Je n'ai pas Windows à portée de main, donc la solution suivante fonctionne sur la machine Linux sur laquelle je l'ai écrite. Une petite modification de l'expression régulière le fera fonctionner sous OS X.

D'abord, vous devez exécuter la commande ping sur la cible. Cela placera la cible - tant qu'elle se trouve dans votre masque de réseau, ce qui semble être le cas dans cette situation - dans le cache ARP de votre système. Observer:

13:40 [email protected]% 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 [email protected]% 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 

Sachant que, vous faites un peu de magie subprocess - sinon vous écrivez du code de vérification du cache ARP vous, et vous ne voulez pas faire:

>>> 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" 
+2

Ha, c'est exactement la réponse que j'étais en train d'écrire! –

+0

Si vous n'avez pas d'arp (ce qui n'est pas le cas pour OpenWRT) et que vous avez le paquet ip-neighbor (qui peut être installé sur OpenWRT), vous pouvez utiliser cette commande pour obtenir la valeur de 'pid': ' pid = Popen (["ip", "neigh", "show", IP], stdout = PIPE) ' –

2

On dirait que vous voulez surveiller les spoofers ARP? Dans ce cas, tout ce dont vous avez besoin est arpwatch, disponible dans chaque distribution Linux bien fournie près de chez vous. Télécharger les sources ici: http://ee.lbl.gov/

3

Il y avait un similar question il y a pas très longtemps sur ce site. Comme mentionné dans la réponse choisie par le demandeur de cette question, Python n'a pas de façon intégrée de le faire. Vous devez appeler une commande système telle que arp pour obtenir des informations ARP ou générer vos propres paquets à l'aide de Scapy.

Edit: Un exemple en utilisant Scapy from their website:

Voici un autre outil qui surveiller en permanence toutes les interfaces sur une machine et imprimer toute demande ARP il voit, même sur les trames 802.11 d'une Carte Wi-Fi en mode moniteur. Notez le paramètre store = 0 à sniff() pour éviter de stocker tous les paquets en mémoire pour rien.

#! /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) 

Pas exactement ce que vous cherchez, mais certainement sur la bonne voie. Prendre plaisir!

0

Essayez d'utiliser les netifaces trouvés ici. netifaces

1

pour les systèmes 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) 

retournera liste de tuples avec macs. scapy est un outil incroyable, mais semble être trop pour ce cas

1

Sous Linux, vous manquez la ligne de commande util "arp". Une base de l'image de l'environnement intégré linux yocto par exemple.

Une autre façon sans l'outil "arp" serait de lire et d'analyser le fichier/proc/net/arp:

[email protected]:~# 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 
0

un moyen plus facile, si sur linux:

print os.system('arp -n ' + str(remoteIP))

vous obtiendrez:

Address  HWtype HWaddress   Flags Mask   Iface 
    192.168..... ether 9B:39:15:f2:45:51 C      wlan0 
Questions connexes