NS的Python dns.resolver不能在子域上工作吗?

时间:2017-12-22 11:21:14

标签: dnspython

我试图获得子域名的NS,但我得到NoAnswer例外。

我怀疑它是因为要求NS只在根域工作,但我该怎么办?

有没有办法使用dnspython来实现它,或者我必须删除每个子部分,直到NS工作?

1 个答案:

答案 0 :(得分:0)

这是我对自己问题的回答。我最终决定走上阶梯,将域的每个子部分移到最后一个点(保留最后两个部分)。

以下是代码:

def ns_lookup(domain):
    parts = domain.split('.')
    lookup = resolver.Resolver()
    lookup.timeout = 3

    ns_ips = None
    while len(parts) >= 2:
        try:
            nameservers = [a.to_text() for a in lookup.query('.'.join(parts), 'NS')]
            ns_ips = [resolver.query(ns)[0].to_text() for ns in nameservers]
            if len(ns_ips) > 0:
                return ns_ips
        except exception.Timeout:
            return []
        except (resolver.NoAnswer, resolver.NXDOMAIN, resolver.NoNameservers):
            pass

        parts.pop(0)

    return False

它的工作原理如下:

ns_ips = ns_lookup(domain)
if ns_ips is False:
    return False

if len(ns_ips) == 0:
    return []

lookup = resolver.Resolver(configure=False)
lookup.timeout = 3
lookup.nameservers = ns_ips
lookup.query(domain, 'A')  # The entry you want.

希望能帮助其他人。