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?
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.
J'utiliserais simplement
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, 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
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)
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.
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.