Python的dnspython库使用指南
因?yàn)槠綍r(shí)在測(cè)試DNS的時(shí)候有些操作手動(dòng)完成不方便,所以需要用到腳本,而在Python里dnspython這個(gè)用于DNS操作的庫(kù)十分強(qiáng)大,但是無(wú)奈網(wǎng)上大部分資料只列舉了少部分的用法,所以記錄一下我平時(shí)使用到的功能,基本上已經(jīng)能應(yīng)付大部分的使用場(chǎng)景了。想具體了解dnspython可以登錄官方網(wǎng)站閱讀使用文檔.
常用工具
最常用的用法是調(diào)用默認(rèn)的resolver發(fā)送解析請(qǐng)求,如
from dns import resolverans = resolver.query("www.baidu.com", "A") print("qname:",ans.qname) print ("reclass:",ans.rdclass) print ("rdtype:",ans.rdtype) print ("rrset:",ans.rrset) print ("response:",ans.response)結(jié)果為
('qname:', <DNS name www.baidu.com.>) ('reclass:', 1) ('rdtype:', 1) ('rrset:', <DNS www.a.shifen.com. IN A RRset>) ('response:', <DNS message, ID 64940>)在這里解析任務(wù)默認(rèn)發(fā)送給系統(tǒng)默認(rèn)的dns服務(wù)器,其中比較重要的是response,在dnspython的官方文檔里,response屬于類(lèi)dns.message.Message,這個(gè)類(lèi)也是許多DNS query請(qǐng)求的返回結(jié)果,下面詳細(xì)介紹下這個(gè)類(lèi)。
類(lèi)的主要成員變量有:
int flags #The DNS flags of the message. int id #The query id; the default is a randomly chosen id. list of RRset addictional list of RRset answer list of RRset authorityflags屬于返回DNS報(bào)文的標(biāo)志位(詳見(jiàn)《TCP/IP詳解(卷一)》關(guān)于DNS的部分),可以利用以下代碼打印DNS報(bào)文的各個(gè)標(biāo)志位:
#!/bin/env python2.7 ans = resolver.query("www.baidu.com", "A")def FlagCount(flags, pos):if (flags/(2**pos))%2 == 1:return Trueelse:return Falsedef GetFlags(flags):QR_pos = 15AA_pos = 10TC_pos = 9RD_pos = 8RA_pos = 7QR_flag = FlagCount(flags, QR_pos)AA_flag = FlagCount(flags, AA_pos)TC_flag = FlagCount(flags, TC_pos)RD_flag = FlagCount(flags, RD_pos)RA_flag = FlagCount(flags, RA_pos)flag_dic = {"QR":QR_flag, "AA":AA_flag, "TC":TC_flag, "RD":RD_flag, "RA":RA_flag}print "flag:",for flag in flag_dic:if flag_dic[flag]:print flag,flags = ans.response.flagsGetFlags(flags)返回結(jié)果為:
flag: AA RD QR RA另外一個(gè)比較重要的類(lèi)就是RRset,通常返回的三個(gè)section信息都使用這個(gè)類(lèi)封裝,常用的用法是使用類(lèi)函數(shù)to_text()令解析結(jié)果以字符串形式顯示。如:
ans = resolver.query("www.baidu.com", "A") for i in ans.response.answer:print i.to_text()結(jié)果為:
www.baidu.com. 1200 IN CNAME www.a.shifen.com. www.a.shifen.com. 119 IN A 220.181.112.244 www.a.shifen.com. 119 IN A 220.181.111.188?
使用實(shí)例:
A記錄查詢(xún)
#!/usr/bin/env python import dns.resolver domain = raw_input('Please input an domain: ') A = dns.resolver.query(domain, 'A')for i in A.response.answer:for j in i.items:print j.address?
MX記錄查詢(xún)(注意輸入域名不包括www)
#!/usr/bin/env python import dns.resolver domain = raw_input('Please input an domain: ') MX = dns.resolver.query(domain, 'MX') for i in MX:print 'MX preference =', i.preference, 'mail exchanger =', i.exchange?
NS記錄查詢(xún)
#!/usr/bin/env python import dns.resolver domain = raw_input('Please input an domain: ') ns = dns.resolver.query(domain, 'NS') for i in ns.response.answer:for j in i.items:print j.to_text()?
CNAME記錄查詢(xún)
#!/usr/bin/env python import dns.resolver domain = raw_input('Please input an domain: ') cname = dns.resolver.query(domain, 'CNAME') for i in cname.response.answer:for j in i.items:print j.to_text()?
轉(zhuǎn)載于:https://www.cnblogs.com/yyxianren/p/10757079.html
總結(jié)
以上是生活随笔為你收集整理的Python的dnspython库使用指南的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 深度学习之pytorch(二) 数据并
- 下一篇: python学习第19天