Python的dnspython庫使用指南


  因為平時在測試DNS的時候有些操作手動完成不方便,所以需要用到腳本,而在Python里dnspython這個用於DNS操作的庫十分強大,但是無奈網上大部分資料只列舉了少部分的用法,所以記錄一下我平時使用到的功能,基本上已經能應付大部分的使用場景了。想具體了解dnspython可以登錄官方網站閱讀使用文檔.

常用工具

最常用的用法是調用默認的resolver發送解析請求,如

from dns import resolver

ans = 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)

結果為

('qname:', <DNS name www.baidu.com.>)
('reclass:', 1)
('rdtype:', 1)
('rrset:', <DNS www.a.shifen.com. IN A RRset>)
('response:', <DNS message, ID 64940>)

  在這里解析任務默認發送給系統默認的dns服務器,其中比較重要的是response,在dnspython的官方文檔里,response屬於類dns.message.Message,這個類也是許多DNS query請求的返回結果,下面詳細介紹下這個類。

類的主要成員變量有:

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 authority

  flags屬於返回DNS報文的標志位(詳見《TCP/IP詳解(卷一)》關於DNS的部分),可以利用以下代碼打印DNS報文的各個標志位:

#!/bin/env python2.7
ans = resolver.query("www.baidu.com", "A")

def FlagCount(flags, pos):
    if (flags/(2**pos))%2 == 1:
        return True
    else:
        return False

def GetFlags(flags):
    QR_pos = 15
    AA_pos = 10
    TC_pos = 9
    RD_pos = 8
    RA_pos = 7
    QR_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.flags

GetFlags(flags)

返回結果為:

flag: AA RD QR RA

  另外一個比較重要的類就是RRset,通常返回的三個section信息都使用這個類封裝,常用的用法是使用類函數to_text()令解析結果以字符串形式顯示。如:

ans = resolver.query("www.baidu.com", "A")
for i in ans.response.answer:
    print i.to_text()

結果為:

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

 

使用實例:

A記錄查詢

#!/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記錄查詢(注意輸入域名不包括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記錄查詢

#!/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記錄查詢

#!/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()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM