2017-01-09 124 views
1

我将更改域的默认名称服务器,然后获取其A记录!我尝试使用下面的代码,但问题是,当我使用IP地址作为名称服务器时,每件事都有效,但是当我使用名称服务器名称(如“ns1.google.com”)时,我无法运行代码并得到异常。任何想法(我使用的代码从这里:Set specific DNS server using dns.resolver (pythondns))?使用不同名称服务器查询

def NsLookupSpecificNS(domain): 
    my_resolver = dns.resolver.Resolver() 

    # 8.8.8.8 is Google's public DNS server 
    my_resolver.nameservers = ['216.239.38.10'] 

    answer = my_resolver.query('google.com', 'A') 
    try: 
     for rdata in answer: 
      print rdata 
    except dns.resolver.NoAnswer: 
      pass 

我已经厌倦了以下内容:

def NsLookupSpecificNS(domain): 
    my_resolver = dns.resolver.Resolver() 

    # 8.8.8.8 is Google's public DNS server 
    my_resolver.nameservers = ['ns1.google.com'] 

    answer = my_resolver.query('google.com', 'A') 
    try: 
     for rdata in answer: 
      print rdata 
    except dns.resolver.NoAnswer: 
      pass 

这里是我得到:

Traceback (most recent call last): 
    File "C:\Users\My Documents\LiClipse Workspace\DNS\Lookup.py", line 49, in <module> 
    NsLookupSpecificNS('google.com') 
    File "C:\Users\My Documents\LiClipse Workspace\DNS\Lookup.py", line 33, in NsLookupSpecificNS 
    answer = my_resolver.query('google.com', 'A') 
    File "C:\Python27\lib\site-packages\dns\resolver.py", line 962, in query 
    source_port=source_port) 
    File "C:\Python27\lib\site-packages\dns\query.py", line 242, in udp 
    if _addresses_equal(af, from_address, destination) or \ 
    File "C:\Python27\lib\site-packages\dns\query.py", line 169, in _addresses_equal 
    n2 = dns.inet.inet_pton(af, a2[0]) 
    File "C:\Python27\lib\site-packages\dns\inet.py", line 51, in inet_pton 
    return dns.ipv4.inet_aton(text) 
    File "C:\Python27\lib\site-packages\dns\ipv4.py", line 48, in inet_aton 
    raise dns.exception.SyntaxError 
dns.exception.SyntaxError: Text input is malformed. 
+1

什么例外?始终提出完整的错误信息。有很多有用的信息。 – furas

+1

dns.resolver从哪里来? –

+0

@furas我更新了问题! – Alex

回答

2

在dnspython, nameservers实例变量需要一个ip地址列表,而不是域名,这就是为什么你会得到这个错误。您需要分别查询ns1.google.com的地址并将该地址(或多个地址)用于后续查询。当然,这引发了你做出第一个查询的地方的问题。为此,您可以尝试使用系统解析器。