15

サーバーにさまざまなレコードを照会するための dns クエリ機能が必要です。MX レコード (ほとんどの例がこれを示しています)、A レコード、および NS レコードを取得する方法を理解しました。TXT、CNAME、および SOA レコードを取得するにはどうすればよいですか?

サンプル コード スニペット:

   import dns.resolver
   answer=dns.resolver.query("google.com", "A")
       for data in answer:
           print data.address

クエリの種類を TXT に、data.address オブジェクトを data.text や data.data などに置き換えてみましたが、属性エラーになってしまいました。前述のデータ型の参照は何ですか?

4

3 に答える 3

28

(返されたデータを把握する方法に答えるため)

TXT、CNAME、SOAレコードも同様の方法で取得できますが、DNS応答オブジェクトに応じて正しい属性を取得する必要があります。

組み込みのpythondir()を使用することは、友だちであり、DNS応答オブジェクトに存在する属性を把握する1つの方法です。APIドキュメントが利用できない場合に便利です。

適切な属性を見つけるには、forループを一時的に次のように変更します。

   for data in answer:
       print dir(data)
       print data

もう1つのより迅速な方法は、dnspythonのAPIドキュメントを確認することです。これらのページには、返された各オブジェクトの属性が一覧表示されます。

最後に、ライブラリがPythonであるかどうか、またはそうでない場合は、Cコードが利用可能かどうかをソースで確認できます。

(そしてあなたの質問に答えるために:)

TXT、CNAME、SOAクエリの例を次に示します。

TXT

http://www.dnspython.org/docs/1.15.0/dns.rdtypes.txtbase.TXTBase-class.html#section-InstanceVariables

answers = dns.resolver.query('google.com', 'TXT')
print ' query qname:', answers.qname, ' num ans.', len(answers)
for rdata in answers:
    for txt_string in rdata.strings:
      print ' TXT:', txt_string

CNAME

http://www.dnspython.org/docs/1.15.0/dns.rdtypes.ANY.CNAME.CNAME-class.html

answers = dns.resolver.query('mail.google.com', 'CNAME')
print ' query qname:', answers.qname, ' num ans.', len(answers)
for rdata in answers:
    print ' cname target address:', rdata.target

SOA

http://www.dnspython.org/docs/1.15.0/dns.rdtypes.ANY.SOA.SOA-class.html#section-InstanceVariables

answers = dns.resolver.query('google.com', 'SOA')
print 'query qname:', answers.qname, ' num ans.', len(answers)
for rdata in answers:
    print ' serial: %s  tech: %s' % (rdata.serial, rdata.rname)
    print ' refresh: %s  retry: %s' % (rdata.refresh, rdata.retry)
    print ' expire: %s  minimum: %s' % (rdata.expire, rdata.minimum)
    print ' mname: %s' % (rdata.mname)
于 2013-01-06T02:41:35.013 に答える
11

少し違うことを試すことができます。

レコード タイプごとに毎回クエリを実行する代わりに、ANY レコードに対して 1 つのクエリを作成できます。このようにして、そのドメインに TXT や CNAME などの両方が含まれている場合、すべてのデータを含む 1 つのオブジェクトが取得されます。

from dns.resolver import dns
name_server = '8.8.8.8' #Google's DNS server
ADDITIONAL_RDCLASS = 65535
request = dns.message.make_query('google.com', dns.rdatatype.ANY)
request.flags |= dns.flags.AD
request.find_rrset(request.additional, dns.name.root, ADDITIONAL_RDCLASS,
                       dns.rdatatype.OPT, create=True, force_unique=True)       
response = dns.query.udp(request, name_server)

これがあなたを助けることを願っています。

于 2014-03-05T13:40:25.870 に答える