2012-12-12 12 views
10

मुझे विभिन्न रिकॉर्ड के लिए सर्वर से पूछने के लिए एक डीएनएस क्वेरी फ़ंक्शन की आवश्यकता है। मुझे पता चला कि एमएक्स रिकॉर्ड कैसे प्राप्त करें (अधिकांश उदाहरण इसे दिखाते हैं), एक रिकॉर्ड और एनएस रिकॉर्ड। मैं TXT, CNAME और SOA रिकॉर्ड कैसे प्राप्त करूं?हम dnspython से TXT, CNAME और SOA रिकॉर्ड कैसे प्राप्त करते हैं?

नमूना कोड स्निपेट:

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

मैंने TXT और data.text साथ data.address वस्तु, data.data आदि के साथ क्वेरी प्रकार की जगह कोशिश की, लेकिन विशेषता त्रुटियों के साथ समाप्त हो गया। मैंने पहले बताए गए डेटा प्रकारों के संदर्भ क्या हैं?

उत्तर

16

(उत्तर देने के लिए कैसे आप दिए गए डेटा पता लगा सकते हैं)

आप TXT, CNAME, और SOA एक समान तरीके से रिकॉर्ड लेकिन आप केवल DNS प्रतिक्रिया वस्तु के आधार पर सही गुण प्राप्त करने के लिए मिल सकता है।

अंतर्निहित पायथन डीआईआर() का उपयोग करना आपका मित्र है और यह पता लगाने का एक तरीका है कि DNS प्रतिक्रिया ऑब्जेक्ट में कौन से गुण मौजूद हैं - आसान है जब API दस्तावेज़ उपलब्ध नहीं है।

उचित गुण यह पता लगाने के लिए, पाश के लिए निम्नलिखित के लिए अस्थायी रूप से अपने को बदलने:

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

एक और और तेज तरीका dnspython के लिए API दस्तावेज़ों को देखने के लिए है, इन पृष्ठों प्रत्येक के लिए विशेषताओं की सूची वस्तु वापस कर दिया।

आखिरकार, यदि लाइब्रेरी पाइथन में है या नहीं, तो यदि स्रोत सी कोड उपलब्ध है तो आप स्रोत को देख सकते हैं।

(और अपने प्रश्न :)

जवाब देने के लिए यहाँ और SOA प्रश्नों TXT, CNAME के ​​उदाहरण हैं:

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 

एसओए

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) 
+0

लिंक टूट रहे हैं ... –

+1

अब समाधान हो गया होगा –

7

तुम कुछ कुछ अलग करने की कोशिश कर सकते हैं।

प्रति रिकॉर्ड प्रकार प्रत्येक बार पूछताछ के बजाय, आप किसी भी रिकॉर्ड के लिए एक ही क्वेरी कर सकते हैं। इस तरह यदि उस डोमेन में TXT, CNAME आदि दोनों हैं ... आपको सभी डेटा के साथ एक ऑब्जेक्ट मिलेगा।

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) 

उम्मीद है कि यह आपकी सहायता कर सकता है।

+0

तुम क्यों निर्दिष्ट करूँ 'ADDITIONAL_RDCLASS = 65535' मैं देखा है और नहीं मिल सकता है यह क्या करता है के रूप में बहुत कुछ। – Nathaniel

0

पिछले उत्तर के साथ उदाहरण के साथ, 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 
संबंधित मुद्दे