我們知道,操作系統提供執行基本DNS查詢的服務。在python的socket模塊當中,提供了訪問這些基本操作系統服務的接口,下看些基本應用。
1. 根據主機名來查詢IP地址:
socket.getaddrinfo(host,port[, family[, socktype[,proto[,flag]]]]
Host參數就是你想查找的域名,其他參數只有當你想把結果直接傳遞給socket.socket( )或者socket.connect()時才用。這個函數的返回值是一列元組,每一列結果如下:
(family, socktype,proto,canonname,sockaddr)
其中sockeaddr就是遠程機器的地址,如果我們只是想得到一個IP地址,我們可以只要列表中的第一個元組。例如:
Dns_test.py
import sys,socket
result=socket.getaddrinfo(sys.argv[1],None)
print result[0][4]
比如說我們在命令行裡輸入:Dns_test.py www.linuxidc.com 回車
結果為:(‘121.194.0.206’,0)
我們也可以測試一下別的網址,而且當我們測試同一個網址,會發現每次運行結果返回的可能不一樣,這是合理的,這樣可以解決負載問題。
(我們在C語言中常用到gethostbyname()函數,python中也有socket.gethostbyname(),但是這個函數和IPv6不兼容,所以就不介紹這個啦)
2 反向查詢
首先說明一點,對於任何域名都會有IP地址和他對應的,但是某些IP地址後卻不一定都有域名和他相對應。所以雖然socket提供了函數gethostbyaddr(),但是這個方法不一定能執行成功,我們需要每一個反向查詢的行為捕捉和處理socket.herror()的錯誤,下面的例子:
import sys,socket
try:
result=socket.gethostbyaddr(sys.argv[1])
print 'Primary hostname'
print ' '+result[0]
print '\nAddresses:'
for item in result[2]:
print " "+item
except socket.herror,e:
print "couldn't look up name:",e
看幾個結果:
如果查不到就會返回失敗信息。
3 簡單pyDNS查詢
PyDNS不是python的標志模塊,你需要到網上下載,地址為http://pydns.sourceforge.net/
我下載的是源文件,然後安裝,在命令行下,進入到存放pyDNS的目錄,然後執行命令:
Python setup.py install 即可。
pyDNS庫提供了DNS模塊,首先應該在應用程序中調用DNS.DiscoverNameServers(),它可以找到系統中的名稱服務器,在windows下是注冊表,Unix系統上時/etc/resolv.conf 。全部的DNS查詢都被發送到這些服務器上。
具體的使用方法見相關文檔。