2012-06-20 32 views
7

Estoy tratando de generar una lista de todas las posibles direcciones IP para un nombre de dominio dado. Creo que estoy cerca, pero no sé lo que me falta (o si hay una mejor manera).Bash lista completa de direcciones IP para un dominio

Primero crear una lista de variaciones del dominio de este modo:

webkinz.com 
www.webkinz.com 

Entonces bucle sobre esta lista y ejecute dig en cada variación de este modo:

while read domain; do 
    IPs=`dig $domain | grep $domain | grep -v ';' | awk '{ print $5 }'`; 
    echo " ${IPs}" >> /tmp/IPs; #array 
done < /tmp/mylist 

sort -u /tmp/IPs > /tmp/TheIPs; #remove duplicates 
cat /tmp/TheIPs| tr -d "\n" > /tmp/IPs #remove new lines (making it 1 long line) 

presentan My IPs miradas de esta manera:

66.48.69.100 www.webkinz.com.edgesuite.net.a1339.g.akamai.net. 

Solo 3 problemas. :-(

  1. Dig regresaron dominios cuando sólo estaba esperando direcciones IP.
  2. De alguna manera mi script elimina los espacios entre los dominios.
  3. Algunas de las direcciones IP de dig www.webkinz.com están desaparecidos.

Así que, ¿cómo debo hacer esto? ¿De algún modo averigüe si dig devolvió otro dominio en lugar de una dirección IP y ejecuta dig en ese dominio? ¿Simplemente ignoro los nombres de dominio devueltos de dig y calculo que las direcciones IP son suficientes? Quiero capturar cada dirección IP que resolverá t o el dominio si es posible. No pensé que debería ser tan difícil. ¿Algunas ideas?

+1

¿Te ha desea sobrescribir el contenido de su archivo de direcciones IP ganado con esfuerzo? 'ordenar -u/tmp/mylist>/tmp/IPs' – chrisaycock

+1

¿Estás seguro de que tu script está bien? En la línea 'sort -u/tmp/mylist>/tmp/IPs; #remove duplicates' está sobrescribiendo el contenido del archivo '/ tmp/IPs' – higuaro

+0

Gracias por anotar los errores en mi publicación. Lo he corregido No fue un error en mi script real. Acabo de cometer un error al cambiar el nombre de mis listas para esta publicación. – exvance

Respuesta

4

el fin de obtener sólo las direcciones IP, utilice dig +short:

#!/bin/bash 
while read -r domain 
do 
    dig +short "$domain" 
done < /tmp/mylist | sort -u | awk '{printf "%s ", $0} END {printf "\n"}' > outputfile 

o

#!/bin/bash 
echo $(xargs -a /tmp/mylist dig +short | sort -u) > outputfile 

El uso de eco con un argumento no indicada gotas de las nuevas líneas excepto al final.

No necesita ninguna variable intermedia o archivo temporal.

+0

¡Esto funciona genial! ¡Gracias! Mi versión de xargs no es compatible con una opción -a así que fui con el primer enfoque. Ahora solo uno de mis 3 problemas originales persiste; la salida todavía tiene dominios en ella. Entonces, ¿necesito recorrer mi salida e investigar en cualquier dominio que encuentre? – exvance

+0

@ user548971: prueba 'dig + short" $ domain "| grep -v '[[: alpha:]]' para eliminar dominios o 'dig + short' $ domain '| mientras se lee -r resultado; hacer si [[$ resultado = ~ [[: alfa:]]]]; luego excavar + corto "$ resultado"; else echo "$ result"; fi; hecho' para recurse. –

0

Utilice la siguiente modificación en la secuencia de comandos para resolver los nombres DNS cuando no es una dirección IP

while read domain; do 
    IPs=`dig $domain | grep $domain | grep -v ';' | awk '{ print $5 }'`; 

    # detect if '$IPs' is an ip address 
    grep "\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}" <(echo $IPs) >/dev/null 2>&1 

    if [ $? -eq 0 ]; then 
     # if IPs is an ip address add it to the file 
     echo " ${IPs}" >> /tmp/IPs; #array   
    else 
     # if not, resolve the domain name using the 'host' command (take just the first line using 'head -1') 
     host $IPs | grep "has address" | head -1 | awk '{ print $4 }' >> /tmp/IPs 
    fi 

done < mylist 
0

da diferentes tipos de respuestas, por lo que es posible que la quinta columna contiene los nombres de dominio. La quinta columna será direcciones IP solo cuando la línea de respuesta sea una respuesta A. Yo sugeriría:

dig -t A $domain 

en lugar de

dig $domain 

a restringir el tipo.

+0

ah, buena captura. Pero, ¿eso daría como resultado direcciones IP que potencialmente se resolverán en el dominio pero que no estarán en mi lista? – exvance

+0

@ user548971: Lo siento, no entiendo tu pregunta. ¿Qué causaría la omisión? – musiphil

+0

... solo mirando la respuesta A e ignorando los dominios. ¿No podría ser que uno de los dominios devueltos en el comando dig tenga una dirección IP que se resolverá en la misma ubicación que el dominio principal? Si no, entonces tal vez no entiendo cavar. – exvance

0

Sé esto ya respondió; Sin embargo, para obtener una lista de las direcciones IPv4 e IPv6, intente esto:

Guión:

info=$(host google.com); echo "$info" | grep "has address" | awk '{print $4}'; echo "$info" | grep "IPv6" | awk '{print $5}' 

host - get the IP addresses 
grep - filter the addresses 
awk - print the correct strings 

script (menos líneas):

host google.com | awk '/address/ {print $NF}' 

Salida:

74.125.45.102 
74.125.45.113 
74.125.45.138 
74.125.45.139 
74.125.45.100 
74.125.45.101 
2607:f8b0:4002:c01::8a 
+1

Simpler: 'host google.com | awk '/ address/{print $ NF}' ' –

Cuestiones relacionadas