2010-05-10 10 views
72

dnspython मेरे DNS लुकअप बहुत अच्छी तरह से करेंगे, लेकिन यह /etc/hosts की सामग्री को पूरी तरह से अनदेखा करता है।मैं पायथन में DNS लुकअप कैसे कर सकता हूं, जिसमें/etc/hosts का जिक्र भी शामिल है?

क्या कोई पाइथन लाइब्रेरी कॉल है जो सही काम करेगा? यानी etc/hosts में पहले जांचें, और केवल अन्यथा DNS लुकअप पर वापस आते हैं?

+0

मैंने इसके लिए एक मुद्दा बनाया: https://github.com/rthalley/dnspython/issues/149 –

+0

dnspython इसे लागू नहीं करेगा। सरल आगे लुकअप के लिए, प्रस्तावित 'socket.gethostbyname' का उपयोग करें, अधिक जटिल प्रश्नों के लिए, dnspython का उपयोग करें। – sebix

उत्तर

78

मुझे सच में यकीन नहीं है कि क्या आप DNS लुकअप स्वयं करना चाहते हैं या यदि आप केवल होस्ट के आईपी चाहते हैं। यदि आप उत्तरार्द्ध चाहते हैं,

import socket 
print socket.gethostbyname('localhost') # result from hosts file 
print socket.gethostbyname('google.com') # your os sends out a dns query 
+7

दरअसल। बोर्ट्ज़मेयर का कोड आईपीवी 4 और आईपीवी 6 सक्षम है। – fmark

+0

क्या किसी को पता है कि इस लुकअप को किस स्तर पर कैश किया गया है? पायथन के भीतर? या ओएस? या DNS सर्वर? –

+0

@ सिमॉन पायथन द्वारा कैश नहीं किया गया, न ही ओएस। यह किसी भी DNS सर्वर पर निर्भर करता है यदि यह कैश करता है या नहीं। - आम तौर पर बोलते हुए: DNS केवल एप्लिकेशन द्वारा ही कैश किया जाता है, या हल करने वाली श्रृंखला में टकराए गए DNS-सर्वर द्वारा। –

76

पायथन में सामान्य नाम समाधान ठीक काम करता है। इसके लिए आपको DNSpython की आवश्यकता क्यों है। बस जो (Debian पर नियमों अपने ऑपरेटिंग सिस्टम के लिए कॉन्फ़िगर इस प्रकार का उपयोग socket के getaddrinfo, यह /etc/nsswitch.conf इस प्रकार है:

>>> print socket.getaddrinfo('google.com', 80) 
[(10, 1, 6, '', ('2a00:1450:8006::63', 80, 0, 0)), (10, 2, 17, '', ('2a00:1450:8006::63', 80, 0, 0)), (10, 3, 0, '', ('2a00:1450:8006::63', 80, 0, 0)), (10, 1, 6, '', ('2a00:1450:8006::68', 80, 0, 0)), (10, 2, 17, '', ('2a00:1450:8006::68', 80, 0, 0)), (10, 3, 0, '', ('2a00:1450:8006::68', 80, 0, 0)), (10, 1, 6, '', ('2a00:1450:8006::93', 80, 0, 0)), (10, 2, 17, '', ('2a00:1450:8006::93', 80, 0, 0)), (10, 3, 0, '', ('2a00:1450:8006::93', 80, 0, 0)), (2, 1, 6, '', ('209.85.229.104', 80)), (2, 2, 17, '', ('209.85.229.104', 80)), (2, 3, 0, '', ('209.85.229.104', 80)), (2, 1, 6, '', ('209.85.229.99', 80)), (2, 2, 17, '', ('209.85.229.99', 80)), (2, 3, 0, '', ('209.85.229.99', 80)), (2, 1, 6, '', ('209.85.229.147', 80)), (2, 2, 17, '', ('209.85.229.147', 80)), (2, 3, 0, '', ('209.85.229.147', 80))] 
+3

परिवर्तन चरण जोड़ने के लिए अच्छा होगा। 'addrs = [str (i [4] [0]) मैं socket.getaddrinfo (नाम, 80) में] 'मुझे ips की सूची देता है। – Alex

-2

मैं में एक DNS आरआर होस्टनाम कि आईपी की एक सूची में विस्तारित विस्तार करने के लिए इस तरह से मिल गया है, सदस्य होस्ट नामों की सूची:

#!/usr/bin/python 

def expand_dnsname(dnsname): 
    from socket import getaddrinfo 
    from dns import reversename, resolver 
    namelist = [ ] 
    # expand hostname into dict of ip addresses 
    iplist = dict() 
    for answer in getaddrinfo(dnsname, 80): 
     ipa = str(answer[4][0]) 
     iplist[ipa] = 0 
    # run through the list of IP addresses to get hostnames 
    for ipaddr in sorted(iplist): 
     rev_name = reversename.from_address(ipaddr) 
     # run through all the hostnames returned, ignoring the dnsname 
     for answer in resolver.query(rev_name, "PTR"): 
      name = str(answer) 
      if name != dnsname: 
       # add it to the list of answers 
       namelist.append(name) 
       break 
    # if no other choice, return the dnsname 
    if len(namelist) == 0: 
     namelist.append(dnsname) 
    # return the sorted namelist 
    namelist = sorted(namelist) 
    return namelist 

namelist = expand_dnsname('google.com.') 
for name in namelist: 
    print name 

जब मैं इसे चलाने कौन सा, सूचीबद्ध कुछ 1e100.net होस्ट नामों:

0
list(map(lambda x: x[4][0], socket.getaddrinfo(\ 
    'www.example.com.',22,type=socket.SOCK_STREAM))) 

आपको www.example.com के लिए पते की एक सूची देता है। (आईपीवी 4 और आईपीवी 6)

संबंधित मुद्दे