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

时间:2018-01-12 16:33:51

标签: 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()

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

我阅读了python套接字文档(https://docs.python.org/2/library/socket.html#socket.getfqdn),并说明了选择带句点的第一个值。但那为什么它不会一直追溯localhost.localdomain

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

1 个答案:

答案 0 :(得分:2)

文档说:

  

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

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

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

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

我也认为它与Python没有任何关系;它是IP堆栈的工作原理。