【问题标题】:Query an array of DNS records with dnspython, and proceed to the next element based on a custom timeout使用 dnspython 查询 DNS 记录数组,并根据自定义超时继续下一个元素
【发布时间】:2017-08-20 08:52:31
【问题描述】:

我正在使用dnspython 查询一堆 DNS 记录,当没有收到回复 (dns.exception.Timeout: The DNS operation timed out after 30.0006685256958 seconds) 时似乎超时。

函数如下:

def dnstest(domain):
    dnsrecords = []
    record_types = ['A', 'AAAA', 'CNAME', 'MX', 'SRV', 'TXT', 'SOA', 'NS']
    dnsResolver = dns.resolver.Resolver()
    for record in record_types:
        dnsAnswer = dnsResolver.query(domain, record)
        for rdata in dnsAnswer:
            dnsrecords.append(rdata)
    return(dnsrecords)

print(dnstest("github.com"))

然而,如果我查询存在的 DNS 记录,则会收到答案:
dnsAnswer = dnsResolver.query(domain, 'A')

我猜这是因为github.com 不存在某些记录(例如SRVAAAA 等)。但是,它们确实存在于其他域中。有没有办法可以在 for 循环中包含每个查询的超时(例如 5 秒)?
像 -
if no response in 5 seconds, move to next element in the array
或者有没有更好的方法来排除不存在的记录?

【问题讨论】:

    标签: python-2.7 python-3.x dns dnspython


    【解决方案1】:

    经过一些快速的谷歌搜索后,以下内容对我有用。

    import dns.resolver
    
    def dnstest(domain):
        dnsrecords = []
        record_types = ['A', 'AAAA', 'CNAME', 'MX', 'SRV', 'TXT', 'SOA', 'NS']
        dnsResolver = dns.resolver.Resolver()
        dnsResolver.timeout = 1
        dnsResolver.lifetime = 1
        for record in record_types:
            try:
                dnsAnswer = dnsResolver.query(domain, record)
                for rdata in dnsAnswer:
                    dnsrecords.append(rdata)
            except:
                pass
    
        return(dnsrecords)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-17
      • 1970-01-01
      相关资源
      最近更新 更多