Чому команда хоста не вирішує записи в / 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

Однак команда хоста неправильно розв’язує ім'я 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 '^]'.

Чому команда хоста не вирішує записи в / 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
Спасибі Kvisle, але я все ще трохи розгублений. Рядок /etc/nsswitch.confвиглядав таким чином, hosts: files dnsі я змінив його, hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4однак в обох випадках /etc/hostsне запитується, натомість з'являється прямий запит dns. Як я можу переконатися, що /etc/hostsспочатку буде запитуватися при використанні команди на зразок digабо host?
користувач784637

4
Ви не можете. dig / host використовує DNS безпосередньо. Якщо вам потрібно зробити пошук імен, який спочатку перевіряє файл хостів, вам доведеться скористатися getent hostsчи іншим, що використовуєgethostbyname()
Kvisle

О, бачу, моє погано, я зараз це зрозумів =)
користувач784637

1
Я вважаю, що нині слід використовувати getent ahostsзамість того, getent hostsщо getent hostsвикористовує gethostbyaddr()або gethostbyname*()які є застарілими. Якщо я правильно зрозумів, getent hostsпідраховує, як працюють старі програми UNIX C, і getent ahostsемулює спосіб роботи програм модерму.
Мікко Ранталайнен

Але чи є спосіб зробити так, щоб команда хоста також використовувала / etc / hosts?
Корнель

10

Оскільки hostутиліта - це виключно утиліта пошуку DNS.

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

Зазвичай /etc/nsswitch.confмістить рядок

hosts:        files dns

Що повідомляє програмі спочатку допитати, /etc/hostsа потім допитати DNS, якщо не вдалося.

Оскільки хости /etc/hostsвиконують виключно пошук DNS, він не заглядає, щоб зробити пошук.


3

Ви знайдете це digі nslookupповедете себе так само, як host.

Причиною цього є те, що мета всіх цих команд - робити пошук DNS, а не шукати файли.

Більшість інших програм використовує розв’язувач імен операційної системи, який консультується, /etc/nsswitch.confа потім (якщо потрібно), /etc/resolv.confщоб вирішити, як вирішити ім'я хоста, про який ви запитуєте. (Це спрощення, є й інші варіанти.) Цей nsswitch.confфайл зазвичай надає перевагу локальним файлам, а не DNS.



-1

перевірте файл /etc/nsswitch.conf і шукайте рядок, що починається зі слова "господарі"? Ви бачите слово "файли" в цьому рядку? Якщо так, то це перед або після слова "dns"?

У звичайній системі ця лінія повинна бути чимось на кшталт

hosts      files dns

якщо вашої немає або в іншому порядку, це може бути вашою проблемою.


Він присутній і виглядає такhosts: files dns
користувач784637
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.