¿Cómo puedo enumerar todas las IP en la red conectada, preferiblemente a través de la Terminal?

219

Usando Ubuntu 10.10, me preguntaba si había un comando de línea de comando que pudiera enumerar todas las IP de los dispositivos conectados a la red.

Usaría esto, por ejemplo, para enumerar todas las computadoras conectadas a mi red doméstica. Idealmente, debe ser la línea de comandos, ya que lo ejecutaré desde C ++.

¿Algunas ideas?

Christopher Gwilliams
fuente

Respuestas:

243

Consulte el comando arp-scan ; probablemente tendrá que instalarlo, por ejemplo:

sudo apt-get install arp-scan

http://manpages.ubuntu.com/manpages/hardy/man1/arp-scan.1.html

Y para dar más detalles:

sudo arp-scan --interface=eth0 --localnet

Donde eth0 es tu dispositivo. Puede encontrar su dispositivo con:

ifconfig
Linker3000
fuente
Perfecto, gracias. Devuelve exactamente el formato que necesito.
Christopher Gwilliams
1
¡Funciona perfectamente en OSX también! Instalado con Brew, y la interfaz era en0, en lugar de eth0, pero funciona muy bien.
nthonygreen
66
Si está conectado a su red utilizando wifi, use en wlan0lugar de eth0.
Neil
3
¿Puede obtener esto para enumerar nombres de host y direcciones IP?
user1527227
2
Vale la pena señalar que esto no usa el caché ARP: realiza un escaneo real. A diferencia de la mayoría de los escaneos nmap, esto no puede cruzar los límites de la capa 3, que generalmente es lo que desea en este escenario. (En otras palabras, está limitado a su subred).
Zenexer
112

Usa nmap. ejemplo: nmap -sn 10.10.10.0/24el arp cache solo le dirá aquellos con los que ha intentado contactar recientemente.

Keith
fuente
2
¿es 10.10.10.0 mi IP dada? ¿Qué es 24 en este caso? Gracias.
kolonel
44
@kolonel Eso es solo un ejemplo. Debe sustituirlo con su red. El 24 es "notación de barra" de la máscara de subred. Significa usar 24 bits desde la izquierda. Es equivalente a 255.255.255.0.
Keith
2
@Keith, ¿sabes cómo averiguaría la dirección de mi red? ¿O es solo mi IP con 0/24 al final?
TMH
20

En Windows esto sería " arp -a" Creo que un equivalente de eso en Linux sería " arp -e".

Esta información se puede encontrar en la página de manual de arp:

arp with no mode specifier will print the current content of the table.
-e : Use default Linux style output format (with fixed columns).
David
fuente
Parece que funciona (es posible que deba jugar porque estoy en una red pública, por lo que solo parece enumerar todos los servidores de la red.
Christopher Gwilliams
Si estoy en una red doméstica, ¿solo enumerará los dispositivos conectados a mi enrutador? ¡Gracias!
Christopher Gwilliams
1
Ese comando solo enumerará los dispositivos en la caché de arp actual de los hosts y esos solo serán los que el host ha contactado recientemente.
Linker3000
Ambos funcionan en Linux, pero arp -amuestran (todos) los hosts en un estilo alternativo (BSD). Simpy corriendo arphace lo mismo que correr arp -eporque ese es el valor predeterminado.
simplegamer
15

Si su red es 192.168.0.0/24, cree un archivo ejecutable con el siguiente código; Cambie el 192.168.0a su red real.

#!/bin/bash
for ip in 192.168.0.{1..254}; do
  ping -c 1 -W 1 $ip | grep "64 bytes" &
done
Anders Larsson
fuente
Hola Anders ... La red del usuario podría no ser 192.168.0.0/24; Hice una nota. Al formato del sitio no le gustaba un #! Y, por lo tanto, superó el formato del fragmento de código: al ingresar el código, use la cita en bloque o los botones de texto preformateados, y revise su respuesta para obtener el formato correcto antes de enviarlo, ya que el carro regresa, pestañas, y los espacios podrían haber sido despojados.
Nevin Williams
Además, cuando se proporciona un script que debe colocarse en un archivo y hacerse ejecutable, en lugar de simplemente cortarlo y pegarlo, probablemente sea mejor que especifique esto; Puede que no sea obvio para algunos lo que se requiere para implementar su solución.
Nevin Williams
12
Técnicamente, esto solo devolverá hosts que responden al ping. Puede haber hosts que estén conectados, pero que no respondan a las solicitudes de eco ICMP. Además, se puede transmitir un paquete a toda una red especificando la dirección de transmisión, que es la última dirección en la red IP: ping -c 1 -W 1 192.168.0.255 lograría lo mismo que el bucle for.
Nevin Williams
@NevinWilliams (requerido -b, eliminado -W para esperar más) ping -b -c 1 192.168.0.255resultado "1 paquetes transmitidos, 0 recibidos, 100% de pérdida de paquetes, tiempo 0ms"
Aquarius Power
13

Intente instalar nmap( sudo apt-get install nmap) y escriba nmap 192.168.1.0/24sustituir 192.168.1con las tres primeras partes de su dirección IP (descúbralo ip addr).

También puede obtener un mapa de una red un poco menos preciso (en mi experiencia) ejecutando ping 192.168.1.255(nuevamente sustituyendo 192.168.1), que debería emitir un pinga cada máquina en la red, pero, en mi experiencia, no siempre funciona correctamente.

Samadi
fuente
En realidad, ninguna de las respuestas siempre funcionará correctamente. IP no fue diseñado con este requisito en mente, y hay cosas como VLAN privadas que hacen que sea imposible encontrar otros hosts en la misma LAN.
Ron Maupin
2

Se me ocurrió lo siguiente en un nexo usando tmuxcomo arp-scanno está en el repositorio pero nmapvino preinstalado, muestra solo las direcciones IP:

nmap -sn 192.168.1.1-254/24 | egrep "scan report" | awk '{print $5}'
zentek
fuente
1

Para una lista más compacta de dispositivos conectados:

nmap -sL 192.168.0.* | grep \(1

Explicación.

nmap -sL 192.168.0.* enumerará todas las IP en la subred y las marcará con el nombre:

Nmap scan report for 192.168.0.0
Nmap scan report for Dlink-Router.Dlink (192.168.0.1)
Nmap scan report for 192.168.0.2
...
Nmap scan report for android-473e80f183648322.Dlink (192.168.0.53)
...
Nmap scan report for 192.168.0.255

Como todos los registros interesantes comienzan con paréntesis (y dígitos 1, lo filtramos con | grep \(1(se necesita una barra invertida para escapar del paréntesis)

Quirk
Tenga en cuenta que si dos dispositivos tienen el mismo nombre, nmapse mostrará sólo el uno, que estaba conectado a un router última

Alexander Malakhov
fuente
Si tiene exactamente la misma respuesta para dos preguntas, puede valer la pena considerar marcar las preguntas como duplicadas en lugar de publicar respuestas duplicadas. De esa forma, el conocimiento se puede compartir a medida que se unen preguntas similares.
Mokubai
1
@Mokubai Tienes razón, agregué comentarios al OP. Esto muestra un problema interesante. Una búsqueda rápida descubrió 6 duplicados (este Q y 5 enlaces) en 4 sitios de red (SU, Ask Ubuntu, SF, Unix). Claro que hay mucho más! ¿Cómo manejo esto? Idealmente, cada una de estas 6 publicaciones debe vincular a otras 5. Agregar todos estos enlaces a mano claramente no escala. Entonces, por ahora me he vinculado a esta publicación (la más votada). Otro problema es que es imposible marcar Q en AskUbuntu como un duplicado de Q en SU. Hm ... Probablemente, esto ya se discutió en el meta?
Alexander Malakhov
no funciona para mí en Centos 7, solo enumera todas las direcciones IP posibles en la red sin nombres. Arp-scan funcionó para mí.
Jeff
0

Ellaborando con la respuesta de Anders Larrson:

#!/bin/bash
function scan ()
{
    for ip in $1.{1..254}; do
        ping -c 1 -W 1 $ip &
    done | sed -nE 's:^.* from ([0-9.]+).*time=(.*s)$:\1 (\2):p'
}

if [ $1 ]; then
    for baseip; do
        scan $baseip
    done
else
    scan 192.168.1
fi
Mathieu CAROFF
fuente