Câu hỏi Làm thế nào tôi có thể thực hiện tra cứu DNS bằng Python, bao gồm việc tham chiếu đến / etc / hosts?


dnspython sẽ thực hiện tra cứu DNS của tôi rất độc đáo, nhưng nó hoàn toàn bỏ qua nội dung của /etc/hosts.

Có một cuộc gọi thư viện python mà sẽ làm điều đúng? tức là kiểm tra trước etc/hostsvà chỉ quay lại tra cứu DNS theo cách khác?


76
2018-05-10 18:14


gốc


Tôi đã tạo ra một vấn đề cho điều đó: github.com/rthalley/dnspython/issues/149 - Greg Dubicki
dnspython sẽ không thực hiện điều này. Để tìm kiếm chuyển tiếp đơn giản, hãy sử dụng đề xuất socket.gethostbyname, đối với các truy vấn phức tạp hơn, hãy sử dụng dnspython. - sebix


Các câu trả lời:


Tôi không thực sự chắc chắn nếu bạn muốn thực hiện tra cứu DNS bản thân bạn hoặc nếu bạn chỉ muốn có một máy chủ của ip. Trong trường hợp bạn muốn thứ hai,

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



Thật. Mã của Bortzmeyer là IPv4 và IPv6 có khả năng. - fmark
Có ai biết ở mức độ tra cứu này được lưu trữ? Trong Python? Hoặc hệ điều hành? Hoặc máy chủ DNS? - Simon East
@Simon Không được lưu trữ bởi Python, cũng như hệ điều hành. Nó phụ thuộc vào bất kỳ máy chủ DNS có liên quan nếu nó lưu trữ hay không. - Nói chung: DNS được lưu trữ chỉ bởi chính ứng dụng đó, hoặc bằng các máy chủ phân giải-DNS được giấu trong chuỗi giải quyết. - Robert Siemer
@ Jochen nếu “localhost” xuất phát từ tệp host hoặc không phụ thuộc vào cấu hình! - Robert Siemer
@RobertSiemer Xin lỗi vì nhận xét muộn: kết quả có thể được lưu trữ bởi trình phân giải cục bộ. nscd và nslcd trên các hộp Unix có thể làm điều này. Nó cũng có thể được lưu trữ bởi một máy chủ tên cục bộ được cấu hình cho bộ nhớ đệm (một thiết lập chung, ngày xửa ngày xưa. Có lẽ bây giờ không quá nhiều). Nó không phải là một câu trả lời "không" đơn giản, thật không may. Những điều này hiếm khi xảy ra. :) - Alexios


Độ phân giải tên bình thường trong Python hoạt động tốt. Tại sao bạn cần DNSpython cho điều đó. Chỉ dùng ổ cắm'S getaddrinfo tuân theo các quy tắc được cấu hình cho hệ điều hành của bạn (trên Debian, nó theo sau /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



sẽ là tốt đẹp để thêm bước chuyển đổi. addrs = [ str(i[4][0]) for i in socket.getaddrinfo(name, 80) ] cho tôi danh sách ips. - Alex


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

cung cấp cho bạn danh sách các địa chỉ cho www.example.com. (ipv4 và ipv6)


0
2018-06-06 18:57





Tôi tìm thấy cách này để mở rộng tên máy chủ DNS RR mở rộng vào danh sách các IP, vào danh sách tên máy chủ thành viên:

#!/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

Trong đó, khi tôi chạy nó, liệt kê một vài tên máy chủ 1e100.net:


-2
2017-11-07 20:02