2012-06-20 4 views
7

sto cercando di produrre un elenco di tutti i possibili indirizzi IP per un determinato nome a dominio. Penso di essere vicino ma non so cosa mi manca (o se c'è un modo migliore).Bash elenco completo di indirizzi IP per un dominio

prima cosa creare un elenco di varianti del dominio in questo modo:

webkinz.com 
www.webkinz.com 

Ho poi un ciclo su questa lista ed eseguire scavo su ogni variazione in questo 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) 

limare le IP sguardi così:

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

Solo 3 problemi. :-(

  1. Dig restituito domini quando ero solo aspettavo indirizzi IP.
  2. Alcuni come il mio script cancellato gli spazi tra i domini.
  3. Alcuni degli indirizzi IP da dig www.webkinz.com sono mancanti.

Allora, come devo fare questo? devo in qualche modo capire se scavo ha restituito un altro dominio, invece di un indirizzo IP e scavo eseguito su quel dominio? Posso solo ignorare i nomi di dominio restituiti da scavare e capire gli indirizzi IP è sufficiente? Voglio prendere ogni indirizzo IP che risolverà t o il dominio, se possibile. Non pensavo che dovesse essere così difficile. Qualche idea?

+1

avete fatto vuoi sovrascrivere il contenuto del tuo sudato file di indirizzi IP? 'sort -u/tmp/mylist>/tmp/IPs ' – chrisaycock

+1

Sei sicuro che lo script sia ok? Nella riga 'sort -u/tmp/mylist>/tmp/IPs; #remove duplicati 'stai sovrascrivendo il contenuto del file'/tmp/IPs ' – higuaro

+0

Grazie per aver notato gli errori nel mio post. L'ho corretto Non era un errore nel mio vero copione. Ho appena fatto un errore quando ho cambiato il nome delle mie liste per questo post. – exvance

risposta

4

Al fine di ottenere solo gli indirizzi IP, utilizzare 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 

uso di echo con un argomento non quotate scende le nuove righe tranne che alla fine.

non avete bisogno di tutte le variabili intermedie o file temporanei.

+0

Funziona alla grande! Grazie! La mia versione di xargs non supporta l'opzione -a quindi sono andato con il primo approccio. Ora solo uno dei miei 3 problemi originali persiste; l'output ha ancora domini in esso. Quindi, devo passare in rassegna il mio output e fare uno scavo su qualsiasi dominio che trovo? – exvance

+0

@ user548971: prova 'dig + short" $ domain "| grep -v '[[: alpha:]]' 'per eliminare i domini o' dig + short "$ dominio" | mentre leggi il risultato -r; fai se [[$ result = ~ [[: alpha:]]]]; quindi digita + short "$ result"; altrimenti echo "$ result"; fi; fatto per recedere. –

0

Usare la seguente modifica nello script per risolvere i nomi DNS quando non è un indirizzo 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

dà diversi tipi di risposte, quindi è possibile che la quinta colonna contiene i nomi di dominio. La quinta colonna sarà indirizzi IP solo quando la linea di risposta è una risposta A. Vorrei suggerire:

dig -t A $domain 

invece di

dig $domain 

per limitare il tipo.

+0

ah, buona cattura. Ma questo si tradurrebbe in indirizzi IP che potrebbero potenzialmente risolvere il dominio ma non essere nella mia lista? – exvance

+0

@ user548971: Siamo spiacenti, non capisco la tua domanda. Cosa causerebbe l'omissione? – musiphil

+0

... solo guardando la risposta A e ignorando i domini. Non potrebbe essere che uno dei domini restituiti nel comando dig ha un indirizzo IP che si risolverà nella stessa posizione del dominio principale? Se no allora forse non capisco scavare. – exvance

0

So che questo ha già risposto; tuttavia, per un elenco di indirizzi IPv4 e IPv6, provate questo:

Script:

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 (meno linee):

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

uscita:

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

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