socket.getfqdn () не возвращает домен, но socket.gethostname () делает? - PullRequest
13 голосов
/ 04 июня 2019

Я не понимаю этого:

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 () должно быть возвращено «полное доменное имя».

Обновление

Больше информации:

/ и т.д. / хосты

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

Смежный вопрос: / etc / HOSTNAME на SuSE: короткое имя или полное доменное имя?

Ответы [ 2 ]

2 голосов
/ 13 июня 2019

/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 IP-адрес.

Если система имеет статический IP-адрес, вы должны использовать этот адрес. Это гарантирует, что система также может определить свое полное доменное имя по IP-адресу (обратный поиск).

Убедитесь, что они работают, перед проверкой из python.

2 голосов
/ 09 июня 2019

Проверьте, что 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, которые вызывают такое поведение. Я полагаю, что следующие вопросы и ответы показывают, как это исправить: https://unix.stackexchange.com/a/77924


Также рассмотрите возможность обновления вашей установки Python. Версия 2.7.3 с 2012 года, последний уровень исправлений для 2.7 - 2.7.16. В getfqdn() нет никаких изменений, но я не проверял gethostbyaddr() или какие другие функции могут вызываться.

...