一。DNS的作用是把域名转换为IP地址。这样就不用记住很多的IP地址,只需要记住域名就行了。
通过这样简单的代码可以完成DNS查询:
#!/usr/bin/python
import sys,socket
print socket.getaddrinfo(sys.argv[1],None)[0][4]#返回了很多个元组,其中每个元组第五项是IP,这里只显示第一个元组的IP,返回的元组中的IP可能会重复,这是因为这个函数会根据不同的协议产生所有结果,在第四个参数加上socket.SOCK_STREAM代表IPv#4后就不会重复了。
一个简单的反向查找例子是这样的:
#!/usr/bin/python
import sys,socket
def gethost():
'''
get hostname
'''
try :
result = socket.gethostbyaddr(sys.argv[1])
except socket.herror ,e :
print "Conldn't look up name:",e
# print result
return result[0]
def is_true(result):#我们需要对返回的域名做一次验证,因为我们反向查询的第一步是访问该IP,而该IP可以在自己的记录中把,这个IP伪装成其他域名。所以简单的正向验证一次是必要的。对于正向DNS,是从权威的.服务器开始的,一般不存在欺骗。
ip = socket.getaddrinfo(result,None)
# get All ip v4
try :
for x in ip:
if x[4][0] == sys.argv[1]:
return True
else:
return False
except socket.herror ,e :
print "Conldn't get info:",e
r = gethost()
if is_true(r):
print r
else:
print "no"
三。小作用,获得环境信息,通常是域名
socket.getfqdn()或者socket.gethostname() 前者能提供更多信息。
四。下面是不使用自带的socket而是用PyDNS包来查询,它可以提供更多的信息,不只是IP和域名。
关于包的安装.查询类型。翻看Py网络编程P76.
下面是个小例子。我们先查询包含了Input(域名)的DNS服务器,我们指定了类型为NS,所以可以找到0个或1个权威的DNS服务器,它包含了Input或者是Input上一级域名(第一个点.后面的),我们通过这个DNS服务查找关于Input的所有信息,这样比直接在本地查可以获取更多的信息。因为本地cache信息可能不完整。
#!/usr/bin/python
import sys,DNS
def getdnsserverlist(qstring,qtype):#递归的找服务器的主函数。
'''show the dns server list'''
reqobj = DNS.Request();
try:
ansobj = reqobj.req(name = qstring, qtype = qtype)
dnslist = [x['data'] for x in ansobj.answers if x['type']==qtype]
except:
dnslist = []
if len(dnslist):
return dnslist
else :
remainder = qstring.split(".",1)
if len(remainder) == 1:
return None
else:
return getdnsserverlist(remainder[1],qtype)
def findnameservers(hostname):#在这里定义了我们要的类型是NS,就是域定义名称服务器
return getdnsserverlist(hostname,DNS.Type.NS)
def getrecord(qstring,qtype,dnslist):#在服务器上找关于Input的信息
for dns in dnslist:
reqobj = DNS.Request(server = dns)
try:
ans = reqobj.req(name = qstring,qtype = qtype).answers
if len(ans):
return ans
except DNS.Base.DNSError:
pass
return []
def query(qstring,qtype,show = 1):
dnslist = findnameservers(qstring)#找个服务器
if dnslist == None:
raise RuntimeError,"Could not find namesever to use."
if show:
print "Using nameservers:",",".join(dnslist)
return getrecord(qstring,qtype,dnslist)
if __name__ == '__main__':
q = sys.argv[1]
DNS.DiscoverNameServers()
ans = query(q,DNS.Type.ANY)
if not len(ans):
print 'Not Found!'
for item in ans:
print "%-5s %s" % (item['typename'],item['data'])
参考资料:py网络编程第四章。