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