socket.getfqdn() returns 没有域,但是 socket.gethostname() 有域吗?
socket.getfqdn() returns no domain, but socket.gethostname() does?
我不明白这个:
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() 的文档,应该返回 "a fully qualified domain name"。
更新
更多信息:
/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
检查你机器上的 socket.gethostbyaddr('sr-mw001.foo-domain.de')
returns。
getfqdn()
的实现依赖于:
https://github.com/python/cpython/blob/2.7/Lib/socket.py#L128-L151
如果 gethostbyaddr()
returns 主机名没有域,也没有别名,则该主机名由 getfqdn()
返回。
问题中的更新信息表明我的猜测很接近。导致此行为的是您 /etc/hosts
中没有域的条目。下面的问答显示了一种修复它的方法,我相信:
https://unix.stackexchange.com/a/77924
同时考虑升级您的 Python 安装。版本 2.7.3 来自 2012,2.7 的最新修复级别是 2.7.16。 getfqdn()
没有变化,但我没有检查 gethostbyaddr()
或可能调用的其他函数。
/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-assigned IP 地址时使用的约定。
如果系统有静态 IP 地址,您应该改用该地址。这将确保系统还可以根据其 IP 地址确定其 FQDN(反向查找)。
在从 python 进行检查之前,请确保它们正常工作。
我不明白这个:
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() 的文档,应该返回 "a fully qualified domain name"。
更新
更多信息:
/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
检查你机器上的 socket.gethostbyaddr('sr-mw001.foo-domain.de')
returns。
getfqdn()
的实现依赖于:
https://github.com/python/cpython/blob/2.7/Lib/socket.py#L128-L151
如果 gethostbyaddr()
returns 主机名没有域,也没有别名,则该主机名由 getfqdn()
返回。
问题中的更新信息表明我的猜测很接近。导致此行为的是您 /etc/hosts
中没有域的条目。下面的问答显示了一种修复它的方法,我相信:
https://unix.stackexchange.com/a/77924
同时考虑升级您的 Python 安装。版本 2.7.3 来自 2012,2.7 的最新修复级别是 2.7.16。 getfqdn()
没有变化,但我没有检查 gethostbyaddr()
或可能调用的其他函数。
/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-assigned IP 地址时使用的约定。
如果系统有静态 IP 地址,您应该改用该地址。这将确保系统还可以根据其 IP 地址确定其 FQDN(反向查找)。
在从 python 进行检查之前,请确保它们正常工作。