আমি পাইথন-এ / ইত্যাদি / হোস্টকে উল্লেখ করে কীভাবে ডিএনএস লুকআপ করব?


98

dnspython আমার DNS লুকআপগুলি খুব সুন্দরভাবে করবে, তবে এটি সম্পূর্ণরূপে এর বিষয়বস্তুগুলিকে উপেক্ষা করে /etc/hosts

একটি পাইথন লাইব্রেরি কল আছে যা সঠিক কাজ করবে? অর্থাত্ প্রথমে চেক ইন করুন etc/hosts, এবং কেবল অন্যথায় ডিএনএস লুকআপে ফিরে যাবেন?


আমি তার জন্য একটি সমস্যা তৈরি করেছি: github.com/rthalley/dnspython/issues/149
গ্রেগ ডাবিকি

4
dnspython এটি প্রয়োগ করবে না। সরল ফরোয়ার্ড socket.gethostbynameলুকআপের জন্য প্রস্তাবিতটি ব্যবহার করুন আরও জটিল প্রশ্নের জন্য, ডিএনস্পাইথন ব্যবহার করুন।
sebix

উত্তর:


120

আমি সত্যিই নিশ্চিত আপনি DNS- র খোঁজ কাজ করতে চান নই নিজেকে অথবা যদি আপনি শুধু একটি হোস্টের আইপি চাই। আপনি যদি দ্বিতীয়টি চান তবে

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

4
কেউ কি জানেন যে কোন স্তরে এই চেহারাটি ক্যাশে করা হয়েছে? পাইথনের মধ্যে? নাকি ওএস? নাকি ডিএনএস সার্ভার?
সাইমন পূর্ব

@ সিমন পাইথন বা ওএস দ্বারা ক্যাশেড নয়। এটি কোনও ডিএনএস সার্ভারের সাথে সম্পর্কিত হয় যদি তা ক্যাশে করে বা না করে। - সাধারণভাবে বলতে: ডিএনএস কেবল অ্যাপ্লিকেশন দ্বারা, বা সমাধান-শৃঙ্খলাবদ্ধ ডিএনএস-সার্ভারগুলির দ্বারা সমাধান করা হয় is
রবার্ট সিমার

@ জোচেন যদি "লোকালহোস্ট" হোস্ট ফাইল থেকে আসে বা কনফিগারেশনের উপর নির্ভর করে না!
রবার্ট সিমার

@ রবার্টসিমার দেরিতে মন্তব্যের জন্য দুঃখিত: ফলাফল স্থানীয় সমাধানকারী দ্বারা ক্যাশে করা যেতে পারে। nscdএবং nslcdইউনিক্স বাক্সগুলিতে এটি করতে পারে। এটি স্থানীয় নাম সার্ভারের মাধ্যমে ক্যাশে করার জন্য কনফিগার করাও যেতে পারে (একটি সাধারণ সেটআপ, একবারে। সম্ভবত এখন এতটা নয়)। দুর্ভাগ্যক্রমে এটি কোনও সোজা 'না' উত্তর নয়। এই জিনিসগুলি খুব কমই হয়। :)
অ্যালেক্সিয়াস

এটি কি কখনও কোনও একক ঠিকানা ফেরত দেবে? সুতরাং আপনার যদি একটি ডিএনএস রাউন্ড রবিন থাকে তবে এটি হোস্টনামের সাথে সম্পর্কিত সমস্ত ঠিকানা প্রকাশ করবে না।
থারস্মমনার

91

পাইথনের সাধারণ নামের রেজোলিউশনটি সূক্ষ্মভাবে কাজ করে। তার জন্য আপনার কেন ডিএনএসপিথন দরকার। শুধু ব্যবহার সকেট এর 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))]

4
রূপান্তর পদক্ষেপ যুক্ত করতে ভাল হবে। addrs = [ str(i[4][0]) for i in socket.getaddrinfo(name, 80) ]আমাকে আইপিএস তালিকা দেয়।
অ্যালেক্স

আমার অনুরোধের ফলাফল একই আইপি ঠিকানা একাধিকবার ফেরত দেয়; আমরা অ্যালেক্সের পরামর্শে একটি সাধারণ পরিবর্তন সহ এটি ঠিক করতে পারি: addrs = { str(i[4][0]:i for i in socket.getaddrinfo(name, 80) }বাক্সটি যুক্ত হওয়ার সাথে কী হিসাবে অনন্য আইপস অন্তর্ভুক্ত করে এমন একটি ডিক ফেরত দেয় ।
tk421storm

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

আপনাকে www.example.com এর জন্য ঠিকানাগুলির একটি তালিকা দেয়। (আইপিভি 4 এবং আইপিভি 6)


1

এই কোডটি সমস্ত আইপি ঠিকানাগুলি যে কোনও নির্দিষ্ট ইউআরআইয়ের সাথে সম্পর্কিত হতে পারে সেগুলি ফিরিয়ে দেওয়ার জন্য ভাল কাজ করে। যেহেতু এখন অনেকগুলি সিস্টেম হোস্ট করা পরিবেশে রয়েছে (এডাব্লুএস / আকামাই / ইত্যাদি), সিস্টেমগুলি বেশ কয়েকটি আইপি অ্যাড্রেস ফিরিয়ে দিতে পারে। ল্যাম্বদা পিটার সিলভা থেকে "ধার করা" হয়েছিল।

def get_ips_by_dns_lookup(target, port=None):
    '''
        this function takes the passed target and optional port and does a dns
        lookup. it returns the ips that it finds to the caller.

        :param target:  the URI that you'd like to get the ip address(es) for
        :type target:   string
        :param port:    which port do you want to do the lookup against?
        :type port:     integer
        :returns ips:   all of the discovered ips for the target
        :rtype ips:     list of strings

    '''
    import socket

    if not port:
        port = 443

    return list(map(lambda x: x[4][0], socket.getaddrinfo('{}.'.format(target),port,type=socket.SOCK_STREAM)))

ips = get_ips_by_dns_lookup(target='google.com')

1

উপরের উত্তরটি পাইথন ২ এর জন্য বোঝানো হয়েছিল আপনি যদি পাইথন 3 ব্যবহার করেন তবে এখানে কোডটি দেওয়া হবে।

>>> import socket
>>> print(socket.gethostbyname('google.com'))
8.8.8.8
>>>

-2

আমি একটি ডিএনএস আরআর হোস্টনাম বিস্তৃত করার জন্য এই উপায়টি পেয়েছি যা সদস্যদের হোস্টনামের তালিকায় আইপিগুলির একটি তালিকাতে প্রসারিত হয়:

#!/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 হোস্টনাম তালিকাবদ্ধ করে:

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.