4

Python dns オブジェクトの使用方法を学習しています。DNSレコードタイプ(CNAME、NSなど)でdns.resolverメソッドを使用する方法を示す多くの例を見ると、簡単な質問があります。この dns オブジェクトを使用して DNS 名を照会し、レコード タイプでその解決を取得する方法はありますか。回答セクションで DIG が提供するものと同様です。

ありがとう、

ジム

4

5 に答える 5

3

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 レコード)。

于 2013-10-05T05:59:32.793 に答える
2

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..."
于 2014-01-28T16:05:24.010 に答える
1

これはどう?

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>}
于 2011-05-05T20:49:58.863 に答える
0

独自の 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
于 2011-05-05T20:40:47.677 に答える