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

Car*_*rot 5 python networking hosts

我不太明白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()
Run Code Online (Sandbox Code Playgroud)

127.0.0.1因此,当我将主机的 fqdn 附加到中的条目末尾时/etc/hostssocket.getfqdn()开始返回localhost.localdomain。但是,如果我删除它,一切都会正常,并且会返回正确的 FQDN。

我阅读了python套接字文档(https://docs.python.org/2/library/socket.html#socket.getfqdn),它说了一些关于选择带有句点的第一个值的内容。但为什么它不总是 retrn 呢localhost.localdomain

基本上,我认为我已经将问题范围缩小到了这一可重现的步骤。但我不知道幕后发生了什么,但我真的很想知道。

900*_*000 2

文档说:

返回 name 的完全限定域名。如果 name 被省略或为空,则它被解释为本地主机

我确信您知道主机可以有多个接口,每个接口可能有自己的 IP 地址(甚至多个),并且IP 地址可以解析为 FQDN。

因此,除了 localhost 之外,主机没有通用的规范 FQDN。如果后者有一个命名条目(我认为它应该),则它会被返回。

尝试.getfqdn() 使用特定的 IP,或者考虑使用gethostbyaddr并从它返回的列表中获取正确的别名。

我还认为它与 Python 没有任何具体关系;这就是 IP 堆栈的工作原理。