当我在主机上使用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
?
基本上,我认为我已经将我的问题缩小到这个可重复的步骤。但我不知道幕后发生了什么,我真的很想。
答案 0 :(得分:2)
文档说:
返回name的完全限定域名。如果省略name或为空,则将其解释为作为本地主机。
我确定您知道主机可以有多个接口,每个接口可能有自己的IP地址(甚至几个), IP地址可以解析为FQDN。
因此,除了localhost之外,主机还有 no 通用规范FQDN。如果它有一个命名条目,后者会被返回(我认为它应该是。)
尝试针对特定IP 的.getfqdn()
,或考虑使用gethostbyaddr
并从其返回的列表中捕获正确的别名。
我也认为它与Python没有任何关系;它是IP堆栈的工作原理。