Codes and Notes while learning DNS.
提示:1. 一個 domain 可以有多筆 record 指向不同的 IP,所以才需要統計結果
2. 可用 subprocess 搭配 nslookup
pip install dnspython
import dns.resolver
my_resolver = dns.resolver.Resolver()
my_resolver.nameservers = ['8.8.8.8']
ipval_cnt = {}
domain = 'google.com'
for i in range(10):
result = dns.resolver.query(domain, 'A')
for ipval in result:
ipval_text = ipval.to_text()
if ipval.to_text() in ipval_cnt:
cnt = ipval_cnt[ipval_text] + 1
ipval_cnt[ipval_text] = cnt
else:
ipval_cnt[ipval_text] = 1
print(ipval_cnt)簡單來說 (點這看詳細)
-
因為
Answer(object)沒有 override__str__
所以print(Answer())會印出object的__str__ -
若
print(Answer().rrset)會呼叫RRset的__str__
則會印出 「google.com. 111 IN A 216.58.200.238」 -
因為
Answer()有 override__iter__
所以 [x for x in Answer()] 等於 [x for x in Answer().rrset]
type(rrset) == RRset -
又因為
RRset繼承Rdataset繼承Set,而Set()有 override__iter__
所以 [x for x in Answer().rrset] 等於 [x for x in Answer().rrset.items] -
而
Set()在__init__有 assignself.items = []
表示 items 的資料型態是 list,所以才需要使用 迴圈,用 for loopprint()出來
