首页 > 编程语言 > 详细

【Python Network】分解DNS查询结果

时间:2014-03-11 15:48:35      阅读:481      评论:0      收藏:0      [点我收藏+]

针对DNS查询records,通过NS、PTR、CNAME和MX类别不同,返回数据将包含另外主机名。为了解最终的IP地址,通过将返回信息分解。继续使用PyDNS获取详细信息。

bubuko.com,布布扣
#! /usr/bin/env python
# DNS query program - Example 4 - DNSquery.py

import sys, DNS, re, DNSany

def getreverse(query):
    """ Given the query, returns an approciate reverse lookup string
        under IN-ADDR.ARPA if query is an IP address; otherwire, return
        None. This function is not IPv6-compatiable. """
    if re.search("^\d+.\d+.\d+.\d+$", query):
        octets = query.split(.)
        octets.reverse()
        return ..join(octets) + .IN-ADDR.ADDR
    return None

def formatline(index, typename, descr, data):
    retval = "%-2s %-5s" % (index, typename)
    data = data.replace("\n", "\n ")
    if descr != None and len(descr):
        retval += " %-12s" % (descr + ":")
    return retval + " " + data

DNS.DiscoverNameServers()
queries = [(sys.argv[1], DNS.Type.ANY)]
donequeries = []
descriptions = {A: IP address,
                TXT: Data,
                PTR: Host name,
                CNAME: Alias for,
                NS: Name server}

while len(queries):
    (query, qtype) = queries.pop(0)
    if query in donequeries:
        # Don‘t look up the same thing twice
        continue
    donequeries.append(query)
    print "-" * 77
    print "Results for %s (lookup type %s)" % (query, DNS.Type.typestr(qtype))
    print
    rev = getreverse(query)
    if rev is not None:
        print "IP address given; doing reverse lookup using", rev
        query = rev
    
    answers = DNSany.nslookup(query, qtype, verbose = 0)    
    if not len(answers):
        print "Not found"
    
    count = 0
    for answer in answers:
        count += 1
        if answer[typename] == MX:
            print formatline(count, MX, Mail Server, 
                             "%s, priority %d" % (answer[data][1], answer[data][0]))
            queries.append((answer[data][1], DNS.Type.A))
        elif answer[typename] == SOA:
            data = "\n" + "\n".join(str(x) for x in answer[data])
            print formatline(count, SOA, Start of authority, data)
        elif answer[typename] in descriptions:
            print formatline(count, answer[typename], descriptions[answer[typename]], str(answer[data]))
        else:
            print formatline(count, answer[typename], None, str(answer[data]))

        if answer[typename] in [CNAME, PTR]:
            queries.append((answer[data], DNS.Type.ANY))
        if answer[typename] == NS:
            queries.append((answer[data], DNS.Type.A))
bubuko.com,布布扣

以baidu.com为例,运行截图如下。
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣

【Python Network】分解DNS查询结果,布布扣,bubuko.com

【Python Network】分解DNS查询结果

原文:http://www.cnblogs.com/bombe1013/p/3592802.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!