#!/usr/bin/env python
importdns.resolver, sysdefget_domain_ip(domain):"""Get the DNS record, if any, for the given domain."""dns_records=list()try:#get the dns resolutions for this domain
dns_results =dns.resolver.query(domain)
dns_records= [ip.address for ip indns_results]exceptdns.resolver.NXDOMAIN as e:print "the domain does not exist so dns resolutions remain empty. domain:", domainexceptdns.resolver.NoAnswer as e:print "the resolver is not answering so dns resolutions remain empty, domain:", domainreturndns_records
hostname= sys.argv[1]print "Recursive name lookup (simulates dig)..."n=hostnametry:whileTrue:for rdata in dns.resolver.query(n, 'CNAME') :printn, "cname is", rdata
n=rdata.targetexcept:print get_domain_ip(n)
例如:
python dig_ip.py 8264.com
Recursive name lookup (simulates dig)...
8264.com cname is qaz2d84guo7uz5q2.gfnormal01at.com.
[u'121.29.18.91'] =>IP地址
python dig_ip.py www.baidu.com
Recursive name lookup (simulates dig)...
www.baidu.com cname is www.a.shifen.com.
www.a.shifen.com. cname is www.wshifen.com.
[u'103.235.46.39', u'103.235.46.40'] =>IP地址
来一个无查询结果的 DGA域名:
python dig_ip.py s09xo3-l5domek9ck5ct3go4m.com
Recursive name lookup (simulates dig)...
the domain does not exist so dns resolutions remain empty. domain: s09xo3-l5domek9ck5ct3go4m.com
[]
其中,dns.resolver.NoAnswer会在查询类别错误时候跑出此异常,例如:
python dig_ip.py www.baidu.com
Recursive name lookup (simulates dig)...
www.baidu.com cname is www.a.shifen.com.
www.a.shifen.com. cname is www.wshifen.com.
The DNS response does not contain an answer to the question: www.wshifen.com. IN CNAME
最后重构下代码:
#!/usr/bin/env python
importdns.resolver, sysdefget_domain_ip(domain):"""Get the DNS record, if any, for the given domain."""dns_records=list()try:#get the dns resolutions for this domain
dns_results =dns.resolver.query(domain)
dns_records= [ip.address for ip indns_results]exceptdns.resolver.NXDOMAIN as e:print "the domain does not exist so dns resolutions remain empty. domain:", domainexceptdns.resolver.NoAnswer as e:print "the resolver is not answering so dns resolutions remain empty, domain:", domainreturndns_recordsdefdig_ip(n):try:whileTrue:for rdata in dns.resolver.query(n, 'CNAME') :print n, "cname is", rdata
n=rdata.targetexceptException as e:printereturnget_domain_ip(n)if __name__ == "__main__":print "Recursive name lookup (simulates dig)..."
print dig_ip(sys.argv[1])