dnspython আমার DNS লুকআপগুলি খুব সুন্দরভাবে করবে, তবে এটি সম্পূর্ণরূপে এর বিষয়বস্তুগুলিকে উপেক্ষা করে /etc/hosts
।
একটি পাইথন লাইব্রেরি কল আছে যা সঠিক কাজ করবে? অর্থাত্ প্রথমে চেক ইন করুন etc/hosts
, এবং কেবল অন্যথায় ডিএনএস লুকআপে ফিরে যাবেন?
socket.gethostbyname
লুকআপের জন্য প্রস্তাবিতটি ব্যবহার করুন আরও জটিল প্রশ্নের জন্য, ডিএনস্পাইথন ব্যবহার করুন।
উত্তর:
আমি সত্যিই নিশ্চিত আপনি DNS- র খোঁজ কাজ করতে চান নই নিজেকে অথবা যদি আপনি শুধু একটি হোস্টের আইপি চাই। আপনি যদি দ্বিতীয়টি চান তবে
import socket
print(socket.gethostbyname('localhost')) # result from hosts file
print(socket.gethostbyname('google.com')) # your os sends out a dns query
nscd
এবং nslcd
ইউনিক্স বাক্সগুলিতে এটি করতে পারে। এটি স্থানীয় নাম সার্ভারের মাধ্যমে ক্যাশে করার জন্য কনফিগার করাও যেতে পারে (একটি সাধারণ সেটআপ, একবারে। সম্ভবত এখন এতটা নয়)। দুর্ভাগ্যক্রমে এটি কোনও সোজা 'না' উত্তর নয়। এই জিনিসগুলি খুব কমই হয়। :)
পাইথনের সাধারণ নামের রেজোলিউশনটি সূক্ষ্মভাবে কাজ করে। তার জন্য আপনার কেন ডিএনএসপিথন দরকার। শুধু ব্যবহার সকেট এর 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))]
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) }
বাক্সটি যুক্ত হওয়ার সাথে কী হিসাবে অনন্য আইপস অন্তর্ভুক্ত করে এমন একটি ডিক ফেরত দেয় ।
list( map( lambda x: x[4][0], socket.getaddrinfo( \
'www.example.com.',22,type=socket.SOCK_STREAM)))
আপনাকে www.example.com এর জন্য ঠিকানাগুলির একটি তালিকা দেয়। (আইপিভি 4 এবং আইপিভি 6)
এই কোডটি সমস্ত আইপি ঠিকানাগুলি যে কোনও নির্দিষ্ট ইউআরআইয়ের সাথে সম্পর্কিত হতে পারে সেগুলি ফিরিয়ে দেওয়ার জন্য ভাল কাজ করে। যেহেতু এখন অনেকগুলি সিস্টেম হোস্ট করা পরিবেশে রয়েছে (এডাব্লুএস / আকামাই / ইত্যাদি), সিস্টেমগুলি বেশ কয়েকটি আইপি অ্যাড্রেস ফিরিয়ে দিতে পারে। ল্যাম্বদা পিটার সিলভা থেকে "ধার করা" হয়েছিল।
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')
আমি একটি ডিএনএস আরআর হোস্টনাম বিস্তৃত করার জন্য এই উপায়টি পেয়েছি যা সদস্যদের হোস্টনামের তালিকায় আইপিগুলির একটি তালিকাতে প্রসারিত হয়:
#!/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 হোস্টনাম তালিকাবদ্ধ করে: