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()
出來