Dlaczego polecenie host nie rozpoznaje wpisów w / etc / hosts?

25

Mam następujący /etc/hostsplik na komputerze z 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

Jednak polecenie hosta nie rozwiązuje puppetmasterpoprawnie nazwy , podczas gdy polecenie telnet tak

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 '^]'.

Dlaczego polecenie host nie rozpoznaje wpisów w / etc / hosts?

użytkownik784637
źródło

Odpowiedzi:

52

hostProgram wykorzystuje libresolvdo wykonywania kwerendy DNS bezpośrednio, czyli nie korzysta gethostbyname.

Większość programów, próbując połączyć się z innym hostem, wywołuje wywołanie gethostbynamesystemowe lub podobną funkcję. Ta funkcja jest zgodna z konfiguracją /etc/nsswitch.conf. Ten plik ma linię, która w Ubuntu 12.04 ma domyślną wartość:

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4

co oznacza, że ​​najpierw użyje /etc/hosts, a potem wróci do zapytań DNS.

Jeśli chcesz wykonać wyszukiwanie hosta w ten sposób, możesz to zrobić za pomocą getent hosts. Na przykład:

$ getent hosts serverfault.com
198.252.206.16  serverfault.com

Mam nadzieję, że to pomoże.

Kvisle
źródło
2
Dzięki, Kvisle, ale wciąż jestem trochę zdezorientowana. Linia /etc/nsswitch.confwyglądała tak hosts: files dnsi zmieniłem ją na hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4jednak w obu przypadkach /etc/hostsnie jest ona odpytywana, zamiast tego wydaje się, że tworzone są bezpośrednie zapytania dns. Jak mogę się upewnić, że /etc/hostszostaną najpierw zapytane przy użyciu polecenia typu diglub host?
user784637 11.04.13
4
Nie możesz dig / host używa DNS bezpośrednio. Jeśli potrzebujesz zrobić namelookup, który najpierw sprawdzi plik hosts, musisz użyć getent hostslub coś innego, co używagethostbyname()
Kvisle 11.04.13
Och, rozumiem, mój zły, mam go teraz =)
user784637
1
Uważam, że w dzisiejszych czasach należy używać getent ahostszamiast z getent hostspowodu getent hostszastosowań gethostbyaddr()lub gethostbyname*()które są przestarzałe. Jeśli dobrze zrozumiałem, getent hostsemuluje, jak stare programy UNIX C działały i getent ahostsemuluje sposób działania programów moderm.
Mikko Rantalainen
Ale czy istnieje sposób, aby polecenie hosta używało również / etc / hosts?
Kornel
10

Ponieważ hostnarzędzie jest wyłącznie narzędziem do wyszukiwania DNS.

Większość aplikacji korzysta z wywołań biblioteki getaddrinfolub gethostbyname. Biblioteki te /etc/nsswitch.confsprawdzają wywołany plik w celu ustalenia priorytetu wyszukiwania i zasad wykonywania różnych wyszukiwań.

Zazwyczaj /etc/nsswitch.confzawiera linię

hosts:        files dns

Który nakazuje programowi najpierw przesłuchać, /etc/hostsa następnie przesłuchać DNS, jeśli się nie powiedzie.

Ponieważ hosty wykonują wyłącznie wyszukiwania DNS, nie /etc/hostswykonuje podglądu.

Matthew Ife
źródło
3

Znajdziesz to digi będziesz nslookupzachowywać się tak samo jak host.

Powodem tego jest to, że celem wszystkich tych poleceń jest wyszukiwanie DNS, a nie wyszukiwanie plików.

Większość innych programów korzysta z mechanizmu rozpoznawania nazw systemu operacyjnego, który konsultuje się, /etc/nsswitch.confa następnie (w razie potrzeby) /etc/resolv.confdecyduje o sposobie rozwiązania żądanej nazwy hosta. (Jest to uproszczenie, istnieją inne opcje). nsswitch.confPlik zwykle ma pierwszeństwo przed plikami lokalnymi, a nie DNS.

Ladadadada
źródło
-1

sprawdzić plik /etc/nsswitch.conf i poszukać linii zaczynającej się od słowa „hosts”? Czy widzisz w tym wierszu słowo „pliki”? Jeśli tak, czy jest to przed czy po słowie „dns”?

W normalnym systemie ta linia powinna być podobna

hosts      files dns

jeśli twój nie jest obecny lub w innej kolejności, może to być twój problem.

MelBurslan
źródło
Jest obecny i wygląda takhosts: files dns
user784637