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"
fonte
2009-11-17 18:44:39
sta evitando ARP gratuito, non controllare roba sulla macchina locale. Leggi attentamente la domanda: ** da un dispositivo sulla mia rete locale ** –