Почему команда host не разрешает записи в / etc / hosts?


25

У меня есть следующий /etc/hostsфайл на машине с Ubuntu 12.04

127.0.0.1 localhost
10.248.27.66 ec2-50-112-220-110.us-west-2.compute.amazonaws.com puppetmaster

# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

Однако команда host не разрешает имя puppetmasterправильно, в то время как команда telnet делает

root@ip-10-248-34-162:/home/ubuntu# host puppetmaster
Host puppetmaster not found: 3(NXDOMAIN)

root@ip-10-248-34-162:/home/ubuntu# telnet puppetmaster 8140
Trying 10.248.27.66...
Connected to ec2-50-112-220-110.us-west-2.compute.amazonaws.com.
Escape character is '^]'.

Почему команда host не разрешает записи в / etc / hosts?

Ответы:


52

hostПрограмма использует libresolvдля выполнения запроса DNS непосредственно, то есть не использовать gethostbyname.

Большинство программ при попытке подключиться к другому хосту вызывают gethostbynameсистемный вызов или аналогичную функцию. Эта функция подчиняется конфигурации /etc/nsswitch.conf. В этом файле есть строка, которая в Ubuntu 12.04 по умолчанию имеет следующий вид:

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4

Это означает, что он сначала будет использовать /etc/hosts, а затем вернуться к DNS-запросам.

Если вы хотите выполнить поиск хоста таким образом, вы можете сделать это с помощью getent hosts. Например:

$ getent hosts serverfault.com
198.252.206.16  serverfault.com

Надеюсь, это поможет.


2
Спасибо Квисле, но я все еще немного растерялся. Строка /etc/nsswitch.confбыла похожа на эту, hosts: files dnsи я изменил ее, hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4однако в обоих случаях /etc/hostsне запрашивается, вместо этого кажется, что прямые DNS-запросы сделаны. Как я могу убедиться, что /etc/hostsсначала будет запрашиваться при использовании команды, как digили host?
user784637

4
Ты не можешь dig / host использует DNS напрямую. Если вам нужно выполнить namelookup, который сначала проверяет файл hosts, вы должны использовать getent hostsили что-то еще, что используетgethostbyname()
Kvisle

О, я вижу, мой плохой, я получил это сейчас =)
user784637

1
Я считаю, что в настоящее время нужно использовать, getent ahostsа не getent hostsпотому, что getent hostsиспользует gethostbyaddr()или gethostbyname*()которые устарели. Если я правильно понял, getent hostsэмулирует, как старые UNIX C-программы раньше работали, и getent ahostsэмулирует, как должны работать программы Moderm.
Микко Ранталайнен,

Но есть ли способ заставить команду host использовать также / etc / hosts?
Корнел

10

Поскольку hostутилита является исключительно утилитой поиска DNS.

Большинство приложений используют библиотечные вызовы getaddrinfoили gethostbyname. Эти библиотеки запрашивают файл, вызываемый /etc/nsswitch.confдля определения приоритета поиска и политики выполнения различных поисков.

Обычно /etc/nsswitch.confсодержит строку

hosts:        files dns

Что говорит программе сначала запрашивать, /etc/hostsа затем запрашивать DNS в случае неудачи.

Так как хосты выполняют исключительно поиск в DNS, он не заглядывает в /etc/hostsнего.


3

Вы найдете это digи будете nslookupвести себя так же, как host.

Причина этого заключается в том, что целью всех этих команд является поиск DNS, а не поиск файлов.

Большинство других программ используют средство разрешения имен операционной системы, которое консультируется, /etc/nsswitch.confа затем (если требуется) /etc/resolv.confрешает, как разрешить запрашиваемое имя хоста. (Это упрощение, есть и другие варианты.) nsswitch.confФайл обычно отдает приоритет локальным файлам, а не DNS.



-1

проверить файл /etc/nsswitch.conf и найти строку, начинающуюся со слова "hosts"? Вы видите слово «файлы» в этой строке? Если да, то до или после слова «днс»?

В обычной системе эта строка должна быть

hosts      files dns

если у вас нет или в другом порядке, это может быть вашей проблемой.


Он присутствует и выглядит такhosts: files dns
user784637
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.