2012-06-20 1 views
7

Ich versuche, eine Liste aller möglichen IP-Adressen für einen bestimmten Domain-Namen zu erstellen. Ich denke ich bin nah dran aber weiß nicht was ich vermisse (oder ob es einen besseren Weg gibt).Bash umfassende Liste von IP-Adressen für eine Domain

Zunächst erstelle ich eine Liste der Änderungen der Domain so:

webkinz.com 
www.webkinz.com 

ich dann Schleife über diese Liste und führen Sie graben auf jede Variante in etwa so:

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) 

My IPs Aussehen Datei wie folgt:

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

Nur 3 Probleme.

:-(
  1. Dig zurück Domains, wenn ich nur IP-Adressen erwartet.
  2. Einige, wie mein Skript die Räume zwischen den Domänen gelöscht.
  3. Einige der IP-Adressen von dig www.webkinz.com fehlen.

Also, wie soll ich das tun? Finde ich irgendwie heraus, wenn dig eine andere Domain statt einer IP-Adresse zurückgegeben und dig auf dieser Domain laufen? Ignorieren Sie einfach Domain-Namen von dig zurückgegeben und die IP-Adressen ausreichend ist? Ich möchte jede IP-Adresse abfangen, die t auflöst o die Domain wenn möglich. Ich hätte nicht gedacht, dass es so schwer sein sollte. Irgendwelche Ideen?

+1

Sie Did Möchten Sie den Inhalt Ihrer hart erarbeiteten IP-Adressdatei überschreiben? 'sort -u/tmp/meine_list>/tmp/IPs' – chrisaycock

+1

Bist du sicher, dass dein Skript in Ordnung ist? In der Zeile 'sort -u/tmp/mylist>/tmp/IPs; # remove duplicates' überschreiben Sie den Dateiinhalt '/ tmp/IPs' – higuaro

+0

Danke, dass Sie die Fehler in meinem Beitrag notiert haben. Ich habe es korrigiert. Es war kein Fehler in meinem echten Skript. Ich habe gerade einen Fehler gemacht, als ich meine Listen für diesen Beitrag umbenannte. – exvance

Antwort

4

Um nur die IP-Adressen zu erhalten, verwenden Sie 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 

oder

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

mit einem nicht notierten Argumente fällt am Ende der Zeilenumbrüche Mit Echo außer.

Sie benötigen keine Zwischenvariablen oder temporäre Dateien.

+0

Das funktioniert super! Vielen Dank! Meine Version von xargs unterstützt keine Option -a, also ging ich mit dem ersten Ansatz. Jetzt besteht nur eines meiner ursprünglichen 3 Probleme weiter; Die Ausgabe enthält noch Domänen. Also, muss ich meine Ausgabe überschleifen und alle Domains durchsuchen, die ich finde? – exvance

+0

@ user548971: Versuchen Sie 'dig + short" $ domain "| grep -v '[[: alpha:]]' 'um Domains zu entfernen oder 'dig + short" $ domain "| während Lese-r Ergebnis; tue, wenn [[$ result = ~ [[: alpha:]]]]]; dann dig + short "$ result"; sonst echo "$ ergebnis"; fi; getan, um zu rekrutieren. –

0

die folgende Änderung in Ihrem Skript Verwenden Sie den DNS-Namen zu lösen, wenn nicht eine

IP-Adresse ist
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

verschiedene Arten von Antworten gibt, so ist es möglich, dass die fünfte Spalte Domain-Namen enthält. Die fünfte Spalte enthält nur IP-Adressen, wenn die Antwortzeile eine A Antwort ist. Ich würde vorschlagen:

dig -t A $domain 

statt

dig $domain 

den Typ zu beschränken.

+0

ah, guter Fang. Aber würde das zu IP-Adressen führen, die möglicherweise in die Domäne aufgelöst werden, aber nicht in meiner Liste enthalten sind? – exvance

+0

@ user548971: Entschuldigung, ich verstehe deine Frage nicht. Was würde die Unterlassung verursachen? – musiphil

+0

... nur die A-Antwort betrachten und die Domänen ignorieren. Könnte es nicht sein, dass eine der Domänen, die im Befehl dig zurückgegeben wurde, eine IP-Adresse hat, die an denselben Speicherort aufgelöst wird wie die primäre Domäne? Wenn nicht, dann verstehe ich vielleicht nicht graben. – exvance

0

Ich weiß das bereits beantwortet; jedoch für eine Liste von IPv4 und IPv6-Adressen, versuchen Sie dies:

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 

Skript (weniger Zeilen):

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

Ausgang:

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 '/ Adresse/{print $ NF}' ' –