web-dev-qa-db-fra.com

socket.getfqdn () ne renvoie aucun domaine, mais socket.gethostname () le fait?

Je ne comprends pas cela:

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'

Qu'est-ce qui ne va pas ici?

Selon les documents de socket.getfqdn () le "nom de domaine complet" devrait être retourné.

Mettre à jour

Plus d'infos:

/ 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

IPs

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'])

Plus de détails:

> 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

Question connexe: / etc/HOSTNAME on SuSE: nom court ou FQDN?

14
guettli

/etc/hostname doit avoir le nom court (non qualifié) (sr-mw00). Le nom du fichier est poussé dans le noyau au démarrage et devrait être vu dans uname.

Ensuite /etc/hosts devrait avoir une entrée comme celle-ci:

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

Cela définit sr-mw001.foo-domain.de comme canonique nom avec sr-mw001 étant un alias.

hostname devrait afficher le nom court. hostname --fqdn devrait afficher le nom canonique complet.

En utilisant 127.0.1.1 est la convention utilisée par l'installateur Debian lorsque le système a une adresse IP attribuée par DHCP.

Si le système a une adresse IP statique, vous devez utiliser cette adresse à la place. Cela garantira que le système peut également déterminer son nom de domaine complet à partir de son adresse IP (une recherche inversée).

Assurez-vous que ceux-ci fonctionnent avant de vérifier à partir de python.

2
Jonathon Reinhart

Vérifiez ce que socket.gethostbyaddr('sr-mw001.foo-domain.de') retourne sur votre machine.

L'implémentation de getfqdn() repose sur cela:
https://github.com/python/cpython/blob/2.7/Lib/socket.py#L128-L151

Si gethostbyaddr() renvoie un nom d'hôte sans domaine et sans alias, alors ce nom d'hôte est renvoyé par getfqdn().


Les informations mises à jour dans la question indiquent que ma supposition était proche. Ce sont les entrées sans domaine dans votre /etc/hosts Qui provoquent ce problème. Les questions et réponses suivantes montrent un moyen de le résoudre, je crois: https://unix.stackexchange.com/a/77924


Pensez également à mettre à niveau votre installation Python. La version 2.7.3 date de 2012, le dernier niveau de correctif pour 2.7 est 2.7.16. Il n'y a pas de changement dans getfqdn(), mais je n'ai pas pas vérifié gethostbyaddr() ou quelles autres fonctions pourraient être appelées.

2
Roland Weber