【问题标题】:socket.getfqdn() returns no domain, but socket.gethostname() does?socket.getfqdn() 不返回域,但是 socket.gethostname() 呢?
【发布时间】:2019-10-19 22:11:00
【问题描述】:

我不明白这个:

Python 2.7.3 (default, Apr 14 2012, 08:58:41) [GCC] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import socket
>>> socket.getfqdn()
'SR-MW001'
>>> socket.gethostname()
'sr-mw001.foo-domain.de'

这里有什么问题?

根据socket.getfqdn() 的文档,应该返回“完全限定的域名”。

更新

更多信息:

/etc/hosts

sr-mw001:~ # grep -iP 'SR-MW001|localhost|foo-domain' /etc/hosts
127.0.0.1       localhost
::1             localhost ipv6-localhost ipv6-loopback
10.189.217.11   SR-MW001 foo-work

IP

sr-mw001:~ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 brd 127.255.255.255 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 00:50:56:a8:6e:eb brd ff:ff:ff:ff:ff:ff
    inet 10.189.217.11/24 brd 10.189.217.255 scope global eth0
       valid_lft forever preferred_lft forever

socket.gethostbyaddr()

>>> socket.gethostbyaddr('sr-mw001.stadtwerke-gt.de')
('SR-MW001', ['foo-work'], ['10.189.217.11'])

更多细节:

> uname -n
sr-mw001.foo-domain.de

> hostname
sr-mw001.foo-domain.de

> domainname
(none)

> nisdomainname
-bash: nisdomainname: command not found

> dnsdomainname
foo-domain.de

> ypdomainname
-bash: ypdomainname: command not found

相关问题:/etc/HOSTNAME on SuSE: short name or FQDN?

【问题讨论】:

  • 您是否在 Python 安装中修改了文件(例如 socket.py)?如果出现任何问题,getfqdn 应该返回 gethostname 的结果。根据输出,您不应该使用原始版本到达这里。您能否粘贴 getfqdn 实现(您可以通过以下方式找到文件:print(socket))?使用这个古老版本的任何理由?
  • 也可以分享 /etc/hosts 内容吗?这只能在一台机器上重现还是一般?您的机器在域中?如果是,你在用什么? nis, ldap, ... ?机器是 IPv6 还是 4?
  • @CristiFati 我更新了这个问题。您问“您的机器在域中?”我该如何检查?
  • @guettli 所以你的问题现在变成了“为什么 socket.gethostbyaddr() 不返回域名?”这听起来更像是 DNS 配置问题,而不是 Python 问题。而且返回的值看起来很像 /etc/hosts 中定义的值。
  • 不幸的是,我无法弄清楚这些函数的行为方式为何。如果我可以在本地重现问题,也许我可以想出一个答案,但我想,每次我需要新的细节时,你都会厌倦更新问题。作为一种解决方法(获取 fqdn),您可以调用 socket.getfqdn(),如果它不包含任何点,请调用 socket.gethostname()。或者你可以做subprocess.check_output(["hostname", "--fqdn"]).split("\n")[0]

标签: python fqdn


【解决方案1】:

检查socket.gethostbyaddr('sr-mw001.foo-domain.de') 在您的计算机上返回的内容。

getfqdn() 的实现依赖于:
https://github.com/python/cpython/blob/2.7/Lib/socket.py#L128-L151

如果gethostbyaddr() 返回的主机名没有域且没有别名,则该主机名由getfqdn() 返回。


问题中的更新信息表明我的猜测很接近。是您的 /etc/hosts 中没有域的条目导致了这种行为。我相信以下问答显示了一种解决方法: https://unix.stackexchange.com/a/77924


还可以考虑升级您的 Python 安装。 2.7.3 版本来自 2012,2.7 的最新修复级别是 2.7.16。 getfqdn() 没有变化,但我没有检查过 gethostbyaddr() 或可能调用的其他函数。

【讨论】:

    【解决方案2】:

    /etc/hostname 应具有短(非限定)名称 (sr-mw00)。文件名在启动时被推入内核,应该可以在uname 中看到。

    那么/etc/hosts 应该有这样的条目:

    127.0.1.1    sr-mw001.foo-domain.de sr-mw001
    

    这会将sr-mw001.foo-domain.de 设置为规范 名称,而sr-mw001 是别名。

    hostname 应该输出短名称。 hostname --fqdn 应该输出完整的规范名称。

    使用 127.0.1.1 是 Debian 安装程序在系统具有 DHCP 分配的 IP 地址时使用的约定。

    如果系统具有静态 IP 地址,则应使用该地址。这将确保系统也可以根据其 IP 地址确定其 FQDN(反向查找)。

    在从 python 进行检查之前,确保这些工作正常。

    【讨论】:

    • 非常感谢您的回答。这个“最佳实践”指南有参考或名称吗?
    • hostname(1) 手册页含糊地暗示了这条路线。经过多次尝试,我基本上学会了这一点。
    猜你喜欢
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多