Bash域的IP地址的完整列表

时间:2012-06-20 21:24:51

标签: bash sed awk grep

我正在尝试为给定的域名生成所有可能的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地址时,Dig返回域名。
  2. 我的脚本如何删除域之间的空格。
  3. dig www.webkinz.com的部分IP地址丢失。
  4. 那么,我该怎么做呢?我是否以某种方式弄清楚dig是否返回了另一个域而不是ip地址并在该域上运行dig?我是否只是忽略从dig返回的域名,并确定IP地址是否足够?我希望抓住每个可以解析到域名的IP地址。我认为不应该这么难。有什么想法吗?

4 个答案:

答案 0 :(得分: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会删除除最后一行之外的换行符。

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

答案 1 :(得分: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

答案 2 :(得分:0)

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

dig -t A $domain

而不是

dig $domain

限制类型。

答案 3 :(得分: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