Python dns オブジェクトの使用方法を学習しています。DNSレコードタイプ(CNAME、NSなど)でdns.resolverメソッドを使用する方法を示す多くの例を見ると、簡単な質問があります。この dns オブジェクトを使用して DNS 名を照会し、レコード タイプでその解決を取得する方法はありますか。回答セクションで DIG が提供するものと同様です。
ありがとう、
ジム
CNAME の例を次に示します。
>>> cname = dns.resolver.query("mail.unixy.net", 'CNAME')
>>> for i in cname.response.answer:
... for j in i.items:
... print j.to_text()
...
unixy.net.
TXT:
>>> txt = dns.resolver.query("unixy.net", 'TXT')
>>> for i in txt.response.answer:
... for j in i.items:
... print j.to_text()
...
"v=spf1 ip4:..."
NS:
>>> ns = dns.resolver.query("unixy.net", 'NS')
>>> for i in ns.response.answer:
... for j in i.items:
... print j.to_text()
...
ns2.unixy.net.
ns1.unixy.net.
同じパターンに従ってほとんどのレコードを取得できます。複数の応答クエリはリストに格納されます。そのため、ループが必要になる場合があります (例: 複数の A および NS レコード)。
AかCNAMEかを判断するためにこれまでに見つけた唯一のチェックは、qname属性がcanonical_name属性と等しいかどうかをテストすることです。
answer = dns.resolver.query('www.example.com')
if answer.qname == answer.canonical_name:
print "This is A record"
else:
print "This isn't A, probably CNAME..."
これはどう?
In [1]: import dns.resolver
In [2]: dns.resolver.query('chipy.org').__dict__
Out[2]:
{'canonical_name': <DNS name chipy.org.>,
'expiration': 1304632023.2383349,
'qname': <DNS name chipy.org.>,
'rdclass': 1,
'rdtype': 1,
'response': <DNS message, ID 64039>,
'rrset': <DNS chipy.org. IN A RRset>}
独自の Resolver クラスをロールする必要があるようです。dns.resolver.query を呼び出すことによって返される Answer オブジェクトには、要求に明確に一致するレコード (デフォルトではたまたま A レコード) のみが含まれます。それはすべてそこにあり、トレイルは途中で失われます。応答を印刷すると、私の意味がわかります。
#!/usr/bin/env python
import dns.resolver
answer = dns.resolver.query('www.clarkmania.com')
print answer.response
print "------"
print answer.rrset