В отличие от простого hostname
вызова команды, вызов hostname --fqdn
попытается сделать еще несколько вещей, что часто приводит к некоторым поискам DNS.
Возьмем, к примеру, следующий (успешный) вызов (это из коробки Red Hat, но я бы предположил, что он должен быть таким же для Ubuntu):
# hostname --fqdn --verbose
gethostname()=`myserver.example.com'
Resolving `myserver.example.com' ...
Result: h_name=`myserver.example.com'
Result: h_addr_list=`10.1.2.3'
myserver.example.com
Обратите внимание на очень полезный --verbose
вариант.
Короче говоря, все, кроме простого hostname
, вероятно, делает больше, чем вы ожидаете. Вот еще один пример:
# hostname --ip --verbose
gethostname()=`myserver.example.com'
Resolving `myserver.example.com' ...
Result: h_name=`myserver.example.com'
Result: h_addr_list=`10.1.2.3'
10.1.2.3
И округлить это:
# hostname --verbose
gethostname()=`myserver.example.com'
myserver.example.com
Обратите внимание, что имя хоста системы (возвращаемое gethostname) может содержать безусловное имя хоста, например просто «myserver». Вот почему программа, которую вы хотите установить, использует hostname --fqdn
вместо этого.
Сообщение об ошибке hostname: Name or service not known
исходит от функций распознавателя : это части системной библиотеки, которые преобразуют имена и адреса (обычно это имена DNS и IP-адреса).
На самом деле, распознаватель делает больше, чем просто DNS (и больше, чем просто перевод между именами хостов и IP-адресами); его поведение частично настраивается файлом /etc/nsswitch.conf
, и обычно он будет обращаться к следующему, обычно в следующем порядке:
- 'hosts' (в Linux это означает / etc / hosts)
- (иногда) nscd (демон кэширования службы имен)
- '' DNS
(обратите внимание, вы также можете иметь кеширующий DNS-сервер, такой как dnsmasqd --- для вышеприведенного пункта, который все еще находится под механизмом 'dns').
Стоит отметить, что такие инструменты, как dig , host и уважаемый nslookup , не следуют этому порядку; они явно являются инструментами DNS-запросов. Это означает, что если вы полагаетесь на них (например, в сценарии), вы можете в итоге получить результат, отличный от результатов обычных клиентских программ (использующих системный преобразователь). По этой причине используйте программу getent в сценариях, особенно если у вас есть компонент кэширования, такой как nscd.
# getent hosts myserver.example.com
10.1.2.3 myserver.example.com
Таким образом, ключевым моментом здесь является то, что а) если у вас / etc / hosts хорошо настроена запись для вашей собственной машины, и б) ваш /etc/nsswitch.conf имеет обычную конфигурацию - hosts: files dns
в таком порядке, то в) даже если у вас нет хорошо настроенного DNS в вашей среде, то hostname --fqdn
должно работать.
В правильно сконфигурированном DNS вы должны иметь один «обратный» адрес («запись PTR»), который дает «каноническое» имя вашего сервера, и это имя также должно быть в состоянии найти (« Запись "для IPv4).
Короткая версия: добавить --verbose
; это укажет вам на то, чего вам не хватает.
Надеюсь, что это поможет вам понять, что происходит.