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 que la machine est 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.

Est-il possible d’obtenir l’adresse IP si tout ce que je sais est l’adresse MAC?

Je ne pense pas qu’il y ait une seule commande pour le faire. Un hack consisterait à effectuer un ping ping ou une diffusion ping sur le sous-réseau, puis à interroger la table arp sur l’adresse IP de l’adresse MAC. Evidemment pas une solution idéale. Exemple:

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

Ici, nmap effectuera une parsing ping et remplira votre cache arp. Une fois l’parsing 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.

Je voudrais simplement utiliser

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

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, alors j’ai fini par re-scanner le réseau en utilisant arp-scan , et donc Adresse IP pour une adresse MAC donnée.

Pour parsingr 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 parsing plusieurs interfaces réseau en même temps:

 { 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 

J’ai écrit un module Python qui peut faire ceci:

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

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

Vous pouvez essayer la commande arp et grep par adresse mac

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

(remplacer par votre propre mac addr)

La réponse de Neal prend effectivement trop de temps. Je devais le faire fonctionner avec une gamme 60k + IPs. L’astuce pour faire ce travail est de vérifier la table arp après chaque ping. Cela corrige également le problème racine: pas besoin. Je l’ai fait en Java (voir threadedScan () ici ) parce que j’étais sur windows et que j’avais besoin d’une solution qui ne génèrerait pas des milliers de commandes cmd en essayant de faire un ping avec la commande start. Et cela fonctionne plus rapidement (~ 10 sec pour mes 60k range) avec un fixedThreadPool.