Comment trouver tous les appareils (adresse IP, nom d'hôte, adresse MAC) sur le réseau local?

13

J'ai lu presque tous les threads liés à cela, mais personne n'a vraiment facilité l'accès à un tableau comme le suivant.

  IP Address     Hostname        MAC Address
  192.168.1.10 | myAppleTV     | 02:78:42:9b:bb:12
  192.168.1.10 | myiPhone      | b2:18:4a:3a:42:22
  192.168.1.10 | myiMac        | 09:17:a2:95:c4:00
  192.168.1.10 | myCanonPrinter| a0:ea:72:77:b4:aa

La plupart du temps, j'en utilise arp -aet il y en a aussi dns-sb, mais aucun d'eux ne permet de trouver facilement 3 informations clés chaque fois que je déconne sur le réseau, à savoir l'adresse IP, le nom d'hôte et l'adresse MAC. Je suis surpris qu'il n'y ait pas d'utilitaire qui accomplisse cela!

Spectramax
la source
Ce type d'informations sera principalement sur le routeur
user151019

Réponses:

12

Si l'utilisation d'un utilitaire tiers n'est pas un problème pour vous, je vous recommande d'essayer ces derniers:

arp-scan (disponible via Homebrew )

brew install arp-scan
arp-scan --localnet

fing (téléchargez et installez le package "Desktop Embedded CLI" depuis fing.com ou via Homebrew brew cask install fing)

sudo fing -r 1 -d true -o table,text

Les deux utilitaires ont un certain nombre de modes et fonctionnalités supplémentaires. Je suggère de lire entièrement les manuels pour en tirer le meilleur parti.

Si vous devez éviter d'utiliser des outils tiers, voici un moyen de faire quelque chose de similaire avec les commandes intégrées. Vous pouvez les exécuter de manière interactive, mais il est probablement plus facile de l'enregistrer en tant que script. NB pour être bref, ce script ne vérifie pas les erreurs et ne fonctionne que sur les sous-réseaux / 24. Le modifier pour qu'il fonctionne sur des sous-réseaux d'autres tailles est laissé au lecteur comme exercice :)

#!/usr/bin/env bash
tab=$'\t'
pIF=$(echo "show State:/Network/Global/IPv4" | scutil | awk -F: '/PrimaryInterface/{sub(/ /,"",$2); print $2}')
sn=$(ipconfig getifaddr $pIF | sed -En 's/^([0-9]+\.[0-9]+\.[0-9]+).*/\1/p')
for i in {1..254}; do ping -i0.1 -W100 -c1 $sn.$i | grep from; done
arp -a | grep $pIF | sed -e 's/^\?/unnamed/' -e "s/\ at\ /${tab}/g" -e "s/\ on\ /${tab}/g" -e 's/\ ifscope.*$//g' | awk 'BEGIN { FS="\t"; OFS="\t"; printf "%-17s\t%-15s\t%s\n", "MAC","INTERFACE","HOSTNAME (IP)" } { if($2!="(incomplete)") {printf "%-17s\t%-15s\t%s\n",$2,$3,$1}}'

Cela devrait produire quelque chose comme:

MAC                 INTERFACE       HOSTNAME (IP)
0:90:b:7a:85:62     en0             r1.lan (192.168.20.1)
2c:36:f8:48:2b:47   en0             cisco-sg300-10p.lan (192.168.20.2)
84:78:ac:a6:95:a0   en0             cisco-sg300-20.lan (192.168.20.3)
b4:fb:e4:cb:93:85   en0             wap1.lan (192.168.20.10)
0:11:32:10:cd:c1    en0             nas.lan (192.168.20.20)
0:11:32:3d:99:c9    en0             nas2.lan (192.168.20.21)
0:11:32:10:cd:c1    en0             unnamed (192.168.20.23)
d4:4b:5e:fe:6a:75   en0             brwd44b5efe6a75.lan (192.168.20.90)
luckman212
la source