歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Python實現DNS查詢

Python實現DNS查詢

日期:2017/3/1 9:48:07   编辑:Linux編程

我們知道,操作系統提供執行基本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查詢都被發送到這些服務器上。

具體的使用方法見相關文檔。

Copyright © Linux教程網 All Rights Reserved