¿Cómo encontrar todos los dispositivos (dirección IP, nombre de host, dirección MAC) en la red local?

He leído casi todos los hilos relacionados con esto, pero nadie ha facilitado el acceso a una tabla como la siguiente.

  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 mayoría de las veces uso arp -ay también hay dns-sb, pero ninguno de ellos hace que sea fácil encontrar 3 piezas clave de información cada vez que estoy jugando en la red, es decir, dirección IP, nombre de host y dirección MAC. ¡Me sorprende que no haya una utilidad que logre esto!

Este tipo de información estará principalmente en el enrutador

Respuestas (1)

Si el uso de una utilidad de terceros no es un problema para usted, le recomiendo que pruebe estos:

arp-scan (disponible a través de Homebrew )

brew install arp-scan
arp-scan --localnet

fing (descargue e instale el paquete "Desktop Embedded CLI" desde fing.com o a través de Homebrew brew cask install fing)

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

Ambas utilidades tienen una serie de modos y funciones adicionales. Sugiero leer los manuales en su totalidad para aprovecharlos al máximo.

Si necesita evitar el uso de herramientas de terceros, esta es una manera de hacer algo similar con los comandos integrados. Puede ejecutarlos de forma interactiva, pero probablemente sea más fácil guardarlos como un script. NB para ser breve, este script no verifica errores y solo funciona en subredes /24. Modificarlo para que funcione en subredes de otros tamaños se deja como ejercicio para el lector :)

#!/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}}'

Esto debería generar algo como:

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)
--localnetno funcionó para mí, pero esto sí (directamente desde la página del manual):arp-scan --interface=en1 192.168.0.0/24