socket.getfqdn()返回的没有域名,但是socket.gethostname()有吗?

16

我不理解这个:

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

相关问题:SuSE上的/etc/HOSTNAME:短名称还是全限定域名?


@CristiFati 我更新了问题。你问“你的机器在域中吗?”我该如何检查? - guettli
@guettli,所以你现在的问题变成了“为什么socket.gethostbyaddr()没有返回域名?”这听起来更像是DNS配置问题,而不是Python问题。而返回的值看起来非常像/etc/hosts中定义的内容。 - Roland Weber
在shell中运行以下命令,并将它们的输出放置在相应位置:uname -nhostnamedomainnamenisdomainnamednsdomainnameypdomainname。此外,您还可以将*/etc/hosts中的grep*搜索扩展到grep -iP 'SR-MW001|localhost|foo-domain\.de' /etc/hosts吗? - CristiFati
@CristiFati 我已根据您的要求更新了问题。 - guettli
1
很遗憾,我无法弄清楚这些函数的行为方式。如果我能在本地重现问题,也许我可以得出答案,但我想你已经厌倦了每次需要新细节时更新问题。作为解决方法(获取* fqdn *),您可以调用socket.getfqdn(),如果它不包含任何点,则调用socket.gethostname()。或者您可以执行subprocess.check_output(["hostname", "--fqdn"]).split("\n")[0] - CristiFati
显示剩余4条评论
2个回答

4

查看在你的机器上运行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.16。 getfqdn()没有变化,但我没有检查gethostbyaddr()或其他可能被调用的函数。


3

/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之前,请确保这些内容正常工作。


非常感谢您的回答。这个“最佳实践”指南有参考资料或名称吗? - guettli
2
hostname(1)手册模糊地建议采用此方法。我在多次尝试后才学会了这一点。 - Jonathon Reinhart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接