サーバーにさまざまなレコードを照会するための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などに置き換えてみましたが、属性エラーが発生しました。前に述べたデータ型のリファレンスは何ですか?
(返されたデータを理解する方法に答えるため)
TXT、CNAME、およびSOAレコードは同様の方法で取得できますが、DNS応答オブジェクトに応じて正しい属性を取得する必要があります。
python dir()ビルトインを使用することはあなたの友人であり、DNS応答オブジェクトにどの属性が存在するかを理解する1つの方法です-APIドキュメントが利用できない場合に便利です。
適切な属性を理解するには、forループを一時的に次のように変更します。
for data in answer:
print dir(data)
print data
別のより迅速な方法は、dnspythonのAPIドキュメントを参照することです。これらのページには、返された各オブジェクトの属性が一覧表示されます。
最後に、ライブラリがpythonにある場合はソースを確認できます。そうでない場合は、Cコードが利用可能であるかどうかを確認できます。
(そしてあなたの質問に答えるために:)
TXT、CNAME、およびSOAクエリの例:
TXT
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)
少し違うものを試すことができます。
レコードタイプごとに毎回クエリを実行する代わりに、任意のレコードに対して単一のクエリを作成できます。このように、そのドメインに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)
これがあなたを助けることを願っています。
前の回答を参考にして、次のコマンドでdnsdig.pyファイルを作成します。
import sys
import socket
import dns.resolver
print 'Argument List:', str(sys.argv)
site = sys.argv[1]
dns_server = sys.argv[2]
# Basic CNAME query the Host's DNS
for rdata in dns.resolver.query(site, 'CNAME') :
print rdata.target
# Basic A query the Host's DNS
for rdata in dns.resolver.query(site, 'A') :
print rdata.address
# Setting an specific DNS Server
resolver = dns.resolver.Resolver()
resolver.nameservers = [socket.gethostbyname(dns_server)]
# Basic CNAME query with the specific DNS server
answer = resolver.query(site, 'CNAME');
for rdata in answer :
print rdata.target
# Basic A query with the specific DNS server
answer = resolver.query(site, 'A');
for rdata in answer :
print rdata.address
走る:
python dnsdig.py www.youtube.com 8.8.8.8