Почему команда 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?

user784637
источник

Ответы:

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

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

Kvisle
источник
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.

Ladadadada
источник
-1

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

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

hosts      files dns

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

MelBurslan
источник
Он присутствует и выглядит такhosts: files dns
user784637