PYTHON3的dnspython模組用法

2021-09-05 02:13:40 字數 4126 閱讀 3377

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

最常用的用法是呼叫預設的resolver傳送解析請求,如:

print ("response:",ans.response)結果為:

('qname:', )

('reclass:', 1)

('rdtype:', 1)

('rrset:', )

('response:', )

在這裡解析任務預設傳送給系統預設的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報文的各個標誌位:

getflags(flags)返回結果為:

flag: aa rd qr ra
另外乙個比較重要的類就是rrset,通常返回的三個section資訊都使用這個類封裝,常用的用法是使用類函式to_text()令解析結果以字串形式顯示。如:

print i.to_text()返回結果為:

www.a.shifen.com. 119 in a 220.181.111.188當需要對自己搭建的dns伺服器傳送解析請求的時候,可以使用dns.query這個類,使用這個類可以對指定的位址、埠傳送自定義的dns解析請求,下面對主要的幾個成員函式貼出官方文件的說明:

##使用udp傳送解析命令

udp(q, where, timeout=none, port=53, af=none, source=none, source_port=0, ignore_unexpected=false, one_rr_per_rrset=false)

return the response obtained after sending a query via udp.

return dns.message.message object

##使用tcp傳送解析命令

tcp(q, where, timeout=none, port=53, af=none, source=none, source_port=0, one_rr_per_rrset=false)

return the response obtained after sending a query via tcp.

return dns.message.message object

其中,形參where對應dns伺服器ip位址,q對應類dns.message.message。返回的結果是dns.message.message,上面已經介紹如何使用這個類。

我們可以通過dns.message.make_query()來構造乙個解析請求。看一下make_query()函式的原型:

make_query(qname, rdtype, rdclass=1, use_edns=none, want_dnssec=false, ednsflags=none, payload=none, request_payload=none, options=none)
基本上設定前兩個數值就夠了。因此,對自己搭建的dns伺服器傳送解析請求可以簡要按照以下步驟:

print i.to_text()也可以通過dnspython對dns進行動態更新。比如在bind伺服器中可以使用rndc工具來對bind進行動態更新,但是操作rndc工具始終不大方便,而我們也可以選擇使用dns.update對bind進行動態更新。

乙個簡單的例子:已知乙個zone的tsig(主輔同步加密)key-value為,我們就可以使用這個事務簽名對這個zone進行更新操作。如,我要對zone testqa.com新增100個rdata為"1.1.1.1"的主機記錄,分別是www1~www100,可以:

import dns.tsigkeyring

import dns.update

import dns.query

zone = "testqa.com"

keyring = dns.tsigkeyring.from_text()

update_query = dns.update.update(zone, keyring=keyring)

for i in range(1,101):

update_query.add("testqa" + str(i), 60, "1.1.1.1")

python3安裝 Python3的安裝

1.anaconda安裝 2.安裝包安裝 3.linux下的命令列安裝 centos red hat 1 sudo yum install y sudo yum update3 sudo yum install y python35u python35u libs python35u devel p...

python3的樣子 python3 基礎

第一周 語言基礎 一 python是一門什麼樣的語言?解釋型動態型別強型別定義語言。二 python2和3的主要區別?1 python3裡可以直接預設寫中文,然後python2裡是不能直接寫的。2 python2裡print不用加括號,可直接寫字串,也可以加 python3裡printi必須要加括號...

python3 切片 python3 切片

取乙個list或tuple的部分元素是非常常見的操作。比如,乙個list如下 l michael sarah tracy bob jack 取前3個元素,應該怎麼做?笨辦法 l 0 l 1 l 2 michael sarah tracy 之所以是笨辦法是因為擴充套件一下,取前n個元素就沒轍了。取前n...