В отличие от простого вызова команды 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 и Venserable nslookup, не следуют этому порядку; они явно являются инструментами DNS-запросов. Это означает, что если вы полагаетесь на них (например, в сценарии), вы можете получить другой результат, чем то, что будут делать обычные клиентские программы (использующие системный преобразователь). По этой причине используйте программу getent в сценариях, особенно если у вас есть компонент кэширования, такой как nscd.
# getent hosts myserver.example.com
10.1.2.3 myserver.example.com
Итак, ключевым моментом здесь является то, что а) если у вас /etc /hosts хорошо настроена запись для вашей собственной машины, и б) ваш /etc/nsswitch.conf имеет обычную конфигурацию - hosts: files dns
в этом порядке, затем c) даже если у вас нет хорошо настроенного DNS в вашей среде, тогда hostname --fqdn
должно работать.
В правильно сконфигурированном DNS вы должны иметь один "обратный" адрес ("запись PTR"), который дает "каноническое" имя вашего сервера, и это имя также можно будет найти (« Запись "для IPv4).
Короткая версия: добавить --verbose
; это укажет вам на то, чего вам не хватает.
Надеюсь, что это поможет вам понять, что происходит.