web-dev-qa-db-fra.com

Puis-je déterminer l'adresse IP actuelle à partir d'une adresse MAC connue?

J'ai un script Shell qui utilise etherwake pour réveiller une machine sur mon réseau local. Une fois la machine réveillée, je ne suis pas sûr de l'adresse IP.

En essayant de répondre à ma propre question, j'ai trouvé:

ip=$(ping -c 1 hostname | head -1 | awk '{print $3}' | sed 's/[()]//g')

Cette solution stipule que je connais le nom d'hôte de la machine distante, ce qui n'est pas si onéreux.

Existe-t-il un moyen d'obtenir l'IP si je ne connais que l'adresse MAC?

25
ddoxey

Je ne pense pas qu'il existe une seule commande pour ce faire. Un piratage consisterait à effectuer une analyse ping ou une diffusion ping sur le sous-réseau, puis à interroger la table arp pour l'adresse IP de l'adresse MAC. Évidemment, ce n'est pas une solution idéale. Exemple:

nmap -sP 192.168.1.0/24 >/dev/null && arp -an | grep <mac address here> | awk '{print $2}' | sed 's/[()]//g'

Ici, nmap effectuera une analyse ping et remplira votre cache arp. Une fois l'analyse terminée, la commande arp peut être utilisée pour imprimer la table arp, puis vous extrayez l'adresse IP avec grep/awk. Vous pouvez essayer de remplacer nmap par un ping de diffusion, mais ce n'est probablement pas aussi fiable.

31
Neal

J'utiliserais simplement

ip neighbor | grep "00:1E:C9:56:3C:8E" | cut -d" " -f1
20
hanoo

Les autres méthodes présentées ici n'étaient pas fiables, par exemple la sortie de ip neighbor ne contenait pas toujours l'état le plus récent, j'ai donc fini par ré-analyser le réseau en utilisant arp-scan, et j'ai donc simplement utilisé la sortie du scan pour obtenir l'adresse IP d'une adresse MAC donnée.

Pour analyser une seule interface réseau, utilisez simplement ceci:

arp-scan -q -l --interface en4 2>/dev/null | grep "00:1E:C9:56:3C:8E" | cut -d$'\t' -f1

La commande suivante analyse plusieurs interfaces réseau à la fois:

{ arp-scan -q -l --interface en0 2>/dev/null & arp-scan -q -l --interface en4 2>/dev/null } | grep "00:1E:C9:56:3C:8E" | cut -d$'\t' -f1
7
Lenar Hoyt

Vous pouvez essayer la commande arp et grep par adresse mac

arp -a | grep "00:00:00:00:00:00"

(remplacer par votre propre addr mac)

5
user3547021

J'ai écrit un module python qui peut le faire:

>>> from ethip import ethip
>>> print ethip.getip('00:1E:C9:56:3C:8E', '10.5.42.255')
10.5.42.3

Je fais juste des requêtes d'arp rapides pour trouver l'ip, puis cache ce qu'il trouve. Le code est sur github.

3
David Mulder

Neal's la réponse prend en effet trop de temps. J'ai dû le faire fonctionner avec une plage de 60k + IPs. L'astuce pour que cela fonctionne est de vérifier la table arp après chaque ping. Cela résout également le problème racine: pas besoin. Je l'ai fait dans Java (voir threadedScan () ici ) parce que j'étais sur Windows et j'avais besoin d'une solution qui ne générerait pas des milliers d'invites cmd en essayant de ping avec la commande start. Et cela fonctionne plus rapidement (~ 10 sec pour ma plage de 60k) avec un FixedThreadPool.

1
eaz