【问题标题】:How to get local network domain name in Python?如何在 Python 中获取本地网络域名?
【发布时间】:2019-01-23 10:55:06
【问题描述】:

我有一个脚本,它在本地网络中获得了一堆本地 IPv4 地址。我可以通过以下方式在 Python2.7 中获取这些 IP 的主机名:

socket.gethostbyaddr(IP)

但是,这些主机名(如果已解析)以以下形式返回:

hostname.local.companyname.com

我对此值感兴趣的唯一一条信息是hostname。我想从完全限定的主机名中删除 local.companyname.com 域名。我可以找到所有已解析主机名的共同方面,然后以这种方式删除它们,但我想知道是否有任何方法可以直接查询本地域本身?

(编辑:这是在 Ubuntu 上运行的)

【问题讨论】:

  • 根据操作系统和网络,正确设置主机名可能会更好。

标签: python python-2.7 networking


【解决方案1】:

默认机器域名试试:

import socket

def get_dns_domain():
    return socket.getfqdn().split('.', 1)[1]

print get_dns_domain()

【讨论】:

    【解决方案2】:

    Ubuntu 喜欢将本地不合格的主机名放在 /etc/hosts 中,并带有这样的环回 IP 地址:

    127.0.1.1   ubuntu-pc
    

    这使得获取您的真实 IP 和域变得困难。

    一种解决方案是使用this answer 获取您的真实(非环回)IP 地址,然后查找该 IP 并使用其域:

    import socket
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.connect(("8.8.8.8", 80))
    myip = s.getsockname()[0]
    s.close()
    fqdn = socket.gethostbyaddr(myip)[0]
    domain = fqdn.split('.', 1)[1]
    print 'myip:', myip
    print 'fqdn:', fqdn
    print 'domain:', domain
    

    输出类似于:

    myip: 192.168.1.33
    fqdn: fred-pc.my.domain
    domain: my.domain
    

    【讨论】:

    • 我已经有 IP 地址(由网络流量提供)。正如我在问题中所说,我可以从socket.gethostbyaddr(IP) 获取域名。我只是想看看是否有任何其他方法可以专门获取域,而不是从完全限定的域名中解析出来。
    【解决方案3】:
    >>> hostname = socket.gethostbyaddr(IP)[0].partition('.')[0]
    >>> hostname
    'myhost'
    
    >>> hostname, domain = socket.gethostbyaddr(IP)[0].partition('.')[::2]
    >>> hostname, domain
    ('myhost', 'here.example.com')
    

    【讨论】:

      猜你喜欢
      • 2017-02-21
      • 2015-11-18
      • 2012-07-12
      • 2011-04-19
      • 2011-02-07
      • 2013-05-28
      • 1970-01-01
      • 1970-01-01
      • 2016-08-15
      相关资源
      最近更新 更多