7

我正在尝试生成给定域名的所有可能 IP 地址的列表。我想我很接近但不知道我错过了什么(或者是否有更好的方法)。

首先,我创建一个域变体列表,如下所示:

 webkinz.com
 www.webkinz.com

然后我遍历这个列表并像这样对每个变体运行 dig:

 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 地址时,Dig 返回域。
  2. 我的脚本如何删除域之间的空格。
  3. dig www.webkinz.com缺少某些 IP 地址。

那么,我该怎么做呢?我是否以某种方式确定 dig 是否返回另一个域而不是 IP 地址并在该域上运行 dig?我是否只是忽略从 dig 返回的域名并认为 ip 地址就足够了?如果可能,我想捕获将解析为域的每个 IP 地址。我不认为这应该这么难。有任何想法吗?

4

4 回答 4

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

将 echo 与未引用的参数一起使用会删除换行符,但末尾除外。

您不需要任何中间变量或临时文件。

于 2012-06-21T00:33:26.330 回答
0

当不是 IP 地址时,在脚本中使用以下修改来解析 dns 名称

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
于 2012-06-20T22:18:20.923 回答
0

dig给出不同类型的响应,因此第五列可能包含域名。仅当响应行是A响应时,第五列才会是 IP 地址。我会建议:

dig -t A $domain

代替

dig $domain

限制类型。

于 2012-06-20T22:19:43.397 回答
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
于 2012-09-30T20:47:12.650 回答