web-dev-qa-db-ja.com

socket.getfqdn()はドメインを返しませんが、socket.gethostname()は返しますか?

ぜんぜんわかりません:

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() のドキュメントによると、「完全修飾ドメイン名」が返されます。

更新

詳細:

/ 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

関連質問: SuSEの/ etc/HOSTNAME:短い名前またはFQDN?

14
guettli

/etc/hostnameには、短い(非修飾)名(sr-mw00)が必要です。ファイルからの名前はブート時にカーネルにプッシュされ、unameに表示されます。

次に、/etc/hostsには次のようなエントリが必要です。

127.0.1.1    sr-mw001.foo-domain.de sr-mw001

これにより、sr-mw001.foo-domain.decanonicalの名前として設定され、sr-mw001がエイリアスになります。

hostnameは短い名前を出力するはずです。 hostname --fqdnは完全な正規名を出力する必要があります。

127.0.1.1の使用は、システムにDHCPによって割り当てられたIPアドレスがある場合にDebianインストーラが使用する規則です。

システムに静的IPアドレスがある場合は、代わりにそのアドレスを使用する必要があります。これにより、システムはIPアドレスからFQDNを決定できるようになります(逆引き)。

Pythonからチェックする前に、これらが機能していることを確認してください。

2

マシンでsocket.gethostbyaddr('sr-mw001.foo-domain.de')が何を返すかを確認します。

getfqdn()の実装はそれに依存しています。
https://github.com/python/cpython/blob/2.7/Lib/socket.py#L128-L151

gethostbyaddr()がドメインなしでホスト名を返し、エイリアスがない場合、そのホスト名はgetfqdn()によって返されます。


質問の更新された情報は、私の推測が近かったことを示しています。この動作を引き起こすのは、ドメインのない_/etc/hosts_のエントリです。次のQ&Aはそれを修正する方法を示していると思います: https://unix.stackexchange.com/a/77924


Python=インストールをアップグレードすることも検討してください。バージョン2.7.3は2012年のもので、2.7の最新のフィックスレベルは2.7.16です。getfqdn()に変更はありませんが、 gethostbyaddr()、または他の関数が呼び出される可能性のあるものをチェックしていません。

2
Roland Weber