为什么Python的socket.getfqdn()有时会返回localhost.localdomain?

5

当我在我的主机上使用socket.getfqdn()时,我不太理解我看到的内容。以下是我看到的内容,然后我会解释一下:

[root@myawesomehost.iscool ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@myawesomehost.iscool ~]#
[root@myawesomehost.iscool ~]#
[root@myawesomehost.iscool ~]# python
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-17)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import socket
>>> socket.getfqdn()
'myawesomehost.iscool.ny.domain.com'
>>> socket.gethostname()
'myawesomehost.iscool.ny.domain.com'
>>>
[1]+  Stopped                 python
[root@myawesomehost.iscool ~]# vim /etc/hosts
[root@myawesomehost.iscool ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 myawesomehost.iscool.ny.domain.com
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6 myawesomehost.iscool.ny.domain.com
[root@myawesomehost.iscool ~]#
[root@myawesomehost.iscool ~]#
[root@myawesomehost.iscool ~]# fg
python

>>> socket.getfqdn()
'localhost.localdomain'
>>> socket.gethostname()
'myawesomehost.iscool.ny.domain.com'
>>>
>>>
>>> exit()

当我将主机的fqdn附加到/etc/hosts中的127.0.0.1条目的末尾时,socket.getfqdn()开始返回localhost.localdomain。但是,如果我删除它,一切都正常,并且它返回正确的fqdn。
我阅读了Python socket文档(https://docs.python.org/2/library/socket.html#socket.getfqdn),它说了一些关于选择第一个带有句点的值的内容。但是为什么它不总是返回localhost.localdomain呢?
基本上,我认为我已经将我的问题缩小到了这个可重现的步骤。但是我不知道内部发生了什么,我真的很想知道。
1个回答

2
文档中说:
返回 name 的完全限定域名。如果省略或为空,则将其解释为本地主机。
我相信您知道一个主机可以有多个接口,每个接口可能有自己的 IP 地址(甚至可能有几个),而该 IP 地址可以解析为 FQDN。
因此,除了 localhost 之外,没有主机的通用规范 FQDN。如果它有一个命名条目(我想应该有),则返回后者。
尝试使用 .getfqdn() 获取特定 IP 的,或考虑使用 gethostbyaddr 并从返回的列表中找到正确的别名。
我还认为它与 Python 没有任何关系;这是 IP 堆栈的工作原理。

我想我明白了...但是为什么只有在将主接口的IP地址的fqdn附加到hosts文件中的127.0.0.1条目时,才会返回localhost.localdomain?我两次都没有传递值,因此两次运行都出现了“名称被省略或为空”的情况。 - Carrot

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