सवाल मैं पायथन में DNS लुकअप कैसे कर सकता हूं, जिसमें / etc / hosts का जिक्र भी शामिल है?


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

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


76
2018-05-10 18:14


मूल


मैंने इसके लिए एक मुद्दा बनाया: github.com/rthalley/dnspython/issues/149 - Greg Dubicki
dnspython इसे लागू नहीं करेगा। सरल आगे लुकअप के लिए, प्रस्तावित का उपयोग करें socket.gethostbyname, अधिक जटिल प्रश्नों के लिए, dnspython का उपयोग करें। - sebix


जवाब:


मैं वास्तव में निश्चित नहीं हूं कि आप DNS लुकअप करना चाहते हैं स्वयं या यदि आप बस एक मेजबान आईपी चाहते हैं। यदि आप उत्तरार्द्ध चाहते हैं,

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

82
2018-05-10 18:36



वास्तव में। बोर्ट्ज़मेयर का कोड आईपीवी 4 और आईपीवी 6 सक्षम है। - fmark
क्या किसी को पता है कि इस लुकअप को किस स्तर पर कैश किया गया है? पायथन के भीतर? या ओएस? या DNS सर्वर? - Simon East
@ सिमॉन पायथन द्वारा नहीं, और न ही ओएस। यह किसी भी DNS सर्वर पर निर्भर करता है यदि यह कैश करता है या नहीं। - आम तौर पर बोलते हुए: DNS केवल एप्लिकेशन द्वारा ही कैश किया जाता है, या हल करने वाली श्रृंखला में टकराए गए DNS-सर्वर द्वारा। - Robert Siemer
@Jochen अगर "localhost" मेजबान फ़ाइल से आता है या नहीं कॉन्फ़िगरेशन पर निर्भर करता है! - Robert Siemer
देर से टिप्पणी के लिए @RobertSiemer क्षमा करें: परिणाम हो सकता है स्थानीय रिज़ॉल्वर द्वारा कैश किया जाना चाहिए। nscd तथा nslcd यूनिक्स बॉक्स पर यह कर सकता है। इसे कैशिंग के लिए कॉन्फ़िगर किए गए स्थानीय नाम सर्वर द्वारा भी कैश किया जा सकता है (एक सामान्य सेटअप, एक बार एक बार। शायद अब इतना नहीं)। दुर्भाग्यवश, यह एक सीधा 'नहीं' जवाब नहीं है। ये चीजें शायद ही कभी हैं। :) - Alexios


पायथन में सामान्य नाम संकल्प ठीक काम करता है। इसके लिए आपको DNSpython की आवश्यकता क्यों है। महज प्रयोग करें सॉकेटकी 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))]

82
2018-05-12 07:44



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


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

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


0
2018-06-06 18:57





मुझे एक 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 होस्टनाम सूचीबद्ध करता है:


-2
2017-11-07 20:02