Nota para el lector : la respuesta original se publicó hace un tiempo y en el momento en que solo estaba aprendiendo scripting de shell. Consulte la versión revisada a continuación para obtener un script nuevo y mejorado que funciona mucho más rápido.
Respuesta original
nmap
sería mi opción número 1, pero ¿y si no la tiene? La forma de bricolaje sería con un script de ping que atraviese manualmente cada dirección IP posible en la red. Lo que tenemos aquí es solo un bucle while, donde establecemos el último número en la dirección, hacemos un solo ping silencioso a la dirección, verificamos si el comando tuvo éxito o no (y si tuvo éxito, entonces el host obviamente está activo) y una printf
declaración. De manera rápida y sucia, me llevó unos 10 minutos escribirlo, pero el tiempo de ejecución puede ser un poco lento.
#!/bin/sh
# set -x
NUM=1
while [ $NUM -lt 256 ];do
ping -q -c 1 192.168.0.$NUM > /dev/null
RESULT=$(echo $?)
if [ $RESULT -eq 0 ]; then
printf 192.168.0.$NUM"\n"
fi
NUM=$(expr $NUM + 1)
done
Respuesta revisada
Originalmente publiqué esta respuesta en agosto de 2015. Desde entonces, he aprendido un poco más sobre las secuencias de comandos de shell, y una vez que vi esta secuencia de comandos, pensé que sería una buena idea revisar esta respuesta para agregar algunas mejoras. Aquí hay algunas ideas:
El script es obviamente lento y ping
espera respuesta del host. Por defecto, ping
para dos RTT, que pueden variar dependiendo de qué tan congestionada esté su red, y hasta donde yo entiendo, el protocolo TCP duplica el tiempo de espera cada vez (al menos de acuerdo con esto ). Entonces podríamos forzar el ping
tiempo de espera con -w 1
bandera. Como tenemos 256 direcciones y suponemos 1 segundo para cada dirección, el script tardará aproximadamente 256/60 = 4.27 minutos.
Hacer un comando y luego capturar su estado de salida con $?
no era realmente necesario. El if ... then;...fi
puede operar en comandos directamente. En otras palabras, es suficiente hacer esto:
if ping -w 1 -q -c 1 192.168.0.$NUM > /dev/null ;
then
<some other code here>
fi
El printf
comando se puede reescribir así:
printf "IP %s is up\n" 192.168.0."$NUM"
Esto es más un cambio estilístico, pero es coherente con la forma en que printf
funciona y se ve en muchos otros idiomas, con comillas "$NUM"
variables. Citar aquí no es necesario, ya que solo tratamos con números, no necesitamos anticipar la división de palabras debido a que hay espacios en una variable.
Se puede lograr una mejora de rendimiento mucho mejor si generamos varios procesos en segundo plano. El guión que se edita a continuación hace exactamente eso. Puse el ping
y printf
en una función, pingf
(sí, cursi, lo sé). Ahora, también hay una única main
función que realiza el bucle y la llamada pingf
.
#!/bin/sh
# Uncomment for debugging
#set -x
pingf(){
if ping -w 2 -q -c 1 192.168.0."$1" > /dev/null ;
then
printf "IP %s is up\n" 192.168.0."$1"
fi
}
main(){
NUM=1
while [ $NUM -lt 255 ];do
pingf "$NUM" &
NUM=$(expr "$NUM" + 1)
done
wait
}
main
¿Cuánto mejor funciona eso? No está mal, en realidad, lleva unos segundos.
$ time ./ping_script.sh
IP 192.168.0.1 is up
IP 192.168.0.101 is up
IP 192.168.0.27 is up
IP 192.168.0.29 is up
0m02.50s real 0m00.01s user 0m00.12s system
Cosas a tener en cuenta
- Windows (a partir de Windows 7, creo) ha comenzado a bloquear la respuesta a las solicitudes de eco ICMP. Hay bastantes preguntas sobre eso en Ask Ubuntu y otros sitios del tipo "Oye, mi computadora Linux puede ser pinchada, pero no las de Windows, ¿qué pasa con eso?" Solo tenga en cuenta el hecho de que para las versiones más recientes de Windows debe habilitar la respuesta al eco ICMP.
angry ip scanner