【问题标题】:python module for nslookup用于 nslookup 的 python 模块
【发布时间】:2012-08-31 02:54:18
【问题描述】:

是否有一个 python 模块与 nslookup 做同样的事情? 我计划使用 nslookup 来挖掘有关要报废的 URL 域的一些信息。我知道我可以使用 os.sys 来调用 nslookup 但我只是想知道是否已经有一个 python 模块。 提前致谢!

【问题讨论】:

    标签: python-module nslookup


    【解决方案1】:

    我正在使用以下代码:

    import socket
    
    ip_list = []
    ais = socket.getaddrinfo("www.yahoo.com",0,0,0,0)
    for result in ais:
      ip_list.append(result[-1][0])
    ip_list = list(set(ip_list))
    

    或者使用理解为:

    ip_list = list({addr[-1][0] for addr in socket.getaddrinfo(name, 0, 0, 0, 0)})
    

    【讨论】:

    • Socket 对于 nslookup 似乎不能很好地工作,尤其是在所有主机名都有多个域的情况下。
    • 这对我来说可以获取 kubernetes statefulset 中的 IP 列表
    【解决方案2】:

    你需要使用DNSPython

    import dns.resolver
    
    answers = dns.resolver.query('dnspython.org', 'MX')
    for rdata in answers:
        print 'Host', rdata.exchange, 'has preference', rdata.preference
    

    【讨论】:

    • 这只返回IP,不返回fqdn
    • dnspython 是一个使用 DNS 的实用程序,因此不使用 /etc/hosts。对于简单的正向 DNS 查找,最好使用 socket.gethostbyname()(来自 dnspython 的 github)
    【解决方案3】:

    问题是 socket.gethostbyname() 只返回一个 IP 地址。 nslookup 尽可能多地返回。 我用:

    import subprocess
    
    process = subprocess.Popen(["nslookup", "www.google.com"], stdout=subprocess.PIPE)
    output = process.communicate()[0].split('\n')
    
    ip_arr = []
    for data in output:
        if 'Address' in data:
            ip_arr.append(data.replace('Address: ',''))
    ip_arr.pop(0)
    
    print ip_arr
    

    它会打印出来:

    ['54.230.228.101', '54.230.228.6', '54.230.228.37', '54.230.228.80', '54.230.228.41', '54.230.228.114', '54.230.228.54', '54.230.228.23']
    

    【讨论】:

      【解决方案4】:

      你应该使用套接字库http://docs.python.org/2/library/socket.html

      在这种情况下,系统函数调用不是一个好习惯。

      【讨论】:

        【解决方案5】:

        请注意,socket.getfqdn() 可以返回主机名的全限定名称。见:http://docs.python.org/2/library/socket.html?highlight=socket.getaddrinfo#socket.getfqdn

        例如:

        python -c  'import socket; print(socket.gethostname()); print(socket.getfqdn());'
        myserver
        myserver.mydomain.local
        

        但结果取决于/etc/hosts 配置。如果你有:

        $ cat /etc/hosts
        127.0.0.1       myserver  localhost.localdomain  localhost
        

        socket.getfqdn() 的结果将是:

        python -c  'import socket; print(socket.getfqdn());'
        localhost.localdomain
        

        哎呀!为了解决这个问题,我知道的唯一解决方案是将/etc/hosts 更改如下:

        $ cat /etc/hosts
        127.0.0.1       myserver  myserver.mydomain.local  localhost.localdomain  localhost
        

        希望对你有帮助!

        【讨论】:

        • 虽然真实而彻底,但它会查找本地系统的主机名/fqdn。 OP 询问如何查找外部 dns 名称以进行站点抓取。仍然为信息 +1。
        • 当我获得 FQDN 时,我可能会获得一半具有完整 FQDN 的服务器,其余的只是主机名。没有。为什么? Nslookup 显示那些无服务器上的 FQDN。
        • @NathanMcKaskle,看看你的/etc/hosts:你可能会自己找到答案。
        • @LaurentLAPORTE 我们有多个 dns 域和不同域中的数千个服务器,我正在尝试从主机名中获取 fqdn,所有返回的只是“主机名”。我的主机看起来像 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 我不知道发生了什么。
        【解决方案6】:

        我需要使用 CNames 在 AWS Route 53 中追踪 A 记录。又名 messaging.myCompany.commoreSpecificMessaging.myCompanyInternal.com

        我也使用 Socket,不过是另一种比较隐蔽的方法。

        import socket
        
        addr1 = socket.gethostbyname_ex('google.com')
        
        print(addr1)
        

        https://docs.python.org/3/library/socket.html#socket.gethostbyname_ex

        【讨论】:

        【解决方案7】:

        以前的答案是正确的,但这是我将使用的 socket,它“提供对 BSD 套接字接口的访问。它适用于所有现代 Unix 系统、Windows、MacOS,可能还有其他平台。”

        import socket
        
        distinct_ips = []
        # 0,0,0,0  is for (family, type, proto, canonname, sockaddr)
        #change some_site.com to whatever your are looking up of course
        socket_info = socket.getaddrinfo("some_site.com",0,0,0,0)
        for result in socket_info:
            ns_ip = result[4][0]
            if distinct_ips.count(ns_ip)==0:
                distinct_ips.append(ns_ip)
                print(ns_ip)
        

        【讨论】:

          【解决方案8】:

          我正在使用以下代码:

          import socket
          addr1 = socket.gethostbyname('google.com')
          addr2 = socket.gethostbyname('yahoo.com')
          print(addr1, addr2)
          

          【讨论】:

          • gethostbyname() 不支持 IPv6 名称解析,应使用 getaddrinfo() 代替 IPv4/v6 双栈支持。
          【解决方案9】:
          $ sudo apt install python-dns
          $ python
          >>> import DNS
          >>> d = DNS.DnsRequest(server="1.1.1.1", timeout=1)                                       
          >>> r = d.req(name="stackoverflow.com", qtype="A")
          >>> [i['data'] for i in r.answers]
          ['151.101.129.69', '151.101.193.69', '151.101.1.69', '151.101.65.69']
          

          还可以访问 ttl 等更多详细信息,此外,这种方法的优点是可以让您指定要使用的名称服务器,而不仅仅是使用系统的默认值。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-11-06
            • 2011-03-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多