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"
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 ** –