2009-11-17 12 views
14

Sto cercando un modo (con python) per ottenere l'indirizzo di livello II da un dispositivo sulla mia rete locale. Gli indirizzi di livello III sono noti.Ottieni indirizzo MAC dai dispositivi usando Python

L'obiettivo è creare uno script che esegua il polling di un database di indirizzi IP a intervalli regolari assicurando che gli indirizzi mac non siano cambiati e, in caso affermativo, invii e-mail a me stesso.

+0

sta evitando ARP gratuito, non controllare roba sulla macchina locale. Leggi attentamente la domanda: ** da un dispositivo sulla mia rete locale ** –

risposta

14

Per rispondere alla domanda con Python dipende dalla piattaforma. Non ho Windows a portata di mano, quindi la seguente soluzione funziona sulla scatola Linux su cui l'ho scritta. Una piccola modifica all'espressione regolare lo farà funzionare in OS X.

In primo luogo, è necessario eseguire il ping della destinazione. Questo posizionerà il bersaglio - purché sia ​​all'interno della maschera di rete, come in questa situazione sarà - nella cache ARP del tuo sistema. Osservare:

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 

Sapendo che, si fa un po 'di magia sottoprocesso - altrimenti si sta scrivendo cache ARP controllo codice da soli, e non si vuole farlo:

>>> 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, questa è esattamente la risposta che stavo scrivendo! –

+0

Se non si dispone di arp (che OpenWRT non lo è) e si ha il pacchetto ip-neighbor (che può essere installato su OpenWRT), è possibile utilizzare questo comando per ottenere il valore di 'pid': ' pid = Popen (["ip", "neigh", "show", IP], stdout = PIPE) ' –

2

Suoni come se si desidera monitorare spoofers ARP? In questo caso, tutto ciò che serve è arpwatch, disponibile in ogni distribuzione Linux ben fornita vicino a te. Scarica qui le fonti: http://ee.lbl.gov/

3

C'è stato un similar question risposto non troppo tempo fa su questo sito. Come menzionato nella risposta scelta dal richiedente di quella domanda, Python non ha un modo integrato per farlo. È necessario chiamare un comando di sistema come arp per ottenere informazioni ARP o generare i propri pacchetti utilizzando Scapy.

Edit: Un esempio utilizzando Scapy from their website:

Ecco un altro strumento che monitorare costantemente tutte le interfacce su una macchina e stampare tutte le richieste ARP è vede, anche su 802.11 fotogrammi da un Scheda Wi-Fi in modalità monitor. Notare che il parametro store = 0 per sniff() per evitare che memorizzi tutti i pacchetti in memoria per nulla.

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

Non è esattamente quello che stai cercando, ma sicuramente sulla strada giusta. Godere!

0

Provare a utilizzare i netifaces trovati qui. netifaces

1

per i sistemi basati su 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) 

lista di tuple tornerà con i Mac. Scapy è uno strumento straordinario, ma sembra essere eccessivo per questo caso

1

In Linux qualche volta manchi la riga di comando util "arp". Ad esempio, un'immagine di ambiente embedded yocto linux di base.

Un modo alternativo senza la funzione "arp" sarebbe quello di leggere e analizzare il file/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 modo più semplice, se su linux:

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

si otterrà:

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