2012-06-20 13 views
7

我試圖給出一個給定域名的所有可能的IP地址列表。我認爲我很接近,但不知道我錯過了什麼(或者如果有更好的方法)。Bash一個域的IP地址的綜合列表

首先我創建域的變化的列表,像這樣:

webkinz.com 
www.webkinz.com 

我然後遍歷每個變化清單和運行挖,像這樣:

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) 

我的IP地址文件看起來像這樣:

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

只有3個問題。 :-(

  1. 挖回來域時,我只期待的IP地址。
  2. 我的腳本一些如何刪除域之間的空間。
  3. 一些從dig www.webkinz.com IP地址的缺失。

那麼,我應該怎麼做呢?我不知道如果挖掘返回另一個域,而不是一個IP地址,並在該域上運行挖?我只是忽略從dig返回的域名,並認爲IP地址是足夠的?我想捕捉每個可以解析t的ip地址o如果可能的話。我不認爲這應該很難。有任何想法嗎?

+1

你有沒有想要覆蓋你辛苦賺取的IP地址文件的內容? 'sort -u/tmp/mylist>/tmp/IPs – chrisaycock

+1

你確定你的腳本沒問題嗎?在'sort -u/tmp/mylist>/tmp/IPs行中, #remove duplicates'您正在覆蓋'/ tmp/IPs'文件內容 – higuaro

+0

感謝您在我的文章中發現錯誤。我已糾正它。這在我的真實劇本中並不是一個錯誤。重新命名本帖子的列表時,我犯了一個錯誤。 – exvance

回答

4

爲了得到公正的IP地址,使用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 

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

使用回聲與帶引號的參數下降到新行除了在結尾。

您不需要任何中間變量或臨時文件。

+0

這很好用!謝謝!我的xargs版本不支持-a選項,所以我採用了第一種方法。現在只有我最初的三個問題中的一個仍然存在;輸出中仍然有域名。那麼,我是否需要遍歷我的輸出並挖掘我發現的任何域? – exvance

+0

@ user548971:試試'dig + short「$ domain」| grep -v'[[:alpha:]]''來消除域名或'dig + short「$ domain」|同時讀取-r結果;如果[[$ result =〜[[:alpha:]]]];然後挖+短「$結果」;其他回聲「$結果」;網絡連接;完成'以緩解。 –

0

使用下面的修改在你的腳本解析DNS名稱不是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

給出了不同類型的響應時,所以它可能是第五列包含域名。僅當響應行是A響應時,第五列將爲IP地址。我建議:

dig -t A $domain 

,而不是

dig $domain 

限制類型。

+0

啊,很好。但是,這是否會導致可能解析爲域名但不在我的列表中的IP地址? – exvance

+0

@ user548971:對不起,我不明白你的問題。什麼會導致遺漏? – musiphil

+0

...只看A迴應而忽略域名。難道它不是在dig命令中返回的域之一有一個IP地址將解析爲與主域相同的位置?如果沒有,那麼也許我不明白挖。 – exvance

0

我知道這已經回答了;然而,對於IPv4和IPv6地址的列表,試試這個:

腳本:

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 

腳本(少線):

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

輸出:

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

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