¿Por qué el comando host no resuelve entradas en / etc / hosts?

25

Tengo el siguiente /etc/hostsarchivo en una máquina 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

Sin embargo, el comando host no resuelve el nombre puppetmastercorrectamente, mientras que el comando telnet sí lo hace

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

¿Por qué el comando host no resuelve entradas en / etc / hosts?

usuario784637
fuente

Respuestas:

52

El hostprograma utiliza libresolvpara realizar una consulta DNS directamente, es decir, no utiliza gethostbyname.

La mayoría de los programas, cuando intentan conectarse a otro host, invocan la gethostbynamellamada al sistema o una función similar. Esta función obedece a la configuración de /etc/nsswitch.conf. Este archivo tiene una línea que en Ubuntu 12.04 tiene el siguiente valor predeterminado:

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4

lo que significa que primero usará /etc/hosts, luego recurrirá a las consultas DNS.

Si desea realizar una búsqueda de host de esta manera, puede hacerlo con getent hosts. Por ejemplo:

$ getent hosts serverfault.com
198.252.206.16  serverfault.com

Espero que esto ayude.

Kvisle
fuente
2
Gracias Kvisle, pero todavía estoy un poco confundido. La línea se /etc/nsswitch.confveía así hosts: files dnsy la cambié a, hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4sin embargo, en ambos casos /etc/hostsno se consulta, sino que parece que se realizan consultas directas. ¿Cómo puedo asegurar que /etc/hostsse consultará primero cuando use un comando como digo host?
user784637
44
No puedes dig / host usa DNS directamente. Si necesita hacer una búsqueda de nombres que primero verifica el archivo de hosts, debe usar getent hostso algo más que usegethostbyname()
Kvisle
Oh, ya veo, mi mal, lo tengo ahora =)
user784637
1
Creo que hoy en día uno debería estar usando en getent ahostslugar de getent hostsporque getent hostsusa gethostbyaddr()o gethostbyname*()que son obsoletos. Si he entendido correctamente, getent hostsemula cómo funcionaban los antiguos programas UNIX C y getent ahostsemula la forma en que deberían funcionar los programas modernos.
Mikko Rantalainen
Pero, ¿hay alguna manera de hacer que el comando del host use también / etc / hosts?
Kornel el
10

Porque la hostutilidad es exclusivamente una utilidad de búsqueda de DNS.

La mayoría de las aplicaciones usan las llamadas a la biblioteca getaddrinfoo gethostbyname. Estas bibliotecas interrogan un archivo llamado /etc/nsswitch.confpara determinar la prioridad de búsqueda y la política de cómo realizar diferentes búsquedas.

Normalmente /etc/nsswitch.confcontiene la línea

hosts:        files dns

Lo que le dice a un programa que primero interrogue /etc/hostsy luego interrogue DNS si no tiene éxito.

Dado que los hosts /etc/hostsrealizan búsquedas de DNS exclusivamente, no se asoma para realizar la búsqueda.

Matthew Ife
fuente
3

Lo encontrará digy se nslookupcomportará de la misma manera que host.

La razón de esto es que el propósito de todos estos comandos es hacer búsquedas DNS, no buscar archivos.

La mayoría de los otros programas utilizan el solucionador de nombre del sistema operativo que consulta /etc/nsswitch.confy luego (si es necesario) /etc/resolv.confpara decidir cómo resolver el nombre de host que está solicitando. (Esto es una simplificación, hay otras opciones). El nsswitch.confarchivo generalmente tiene prioridad sobre los archivos locales en lugar de DNS.

Ladadadada
fuente
-1

verifique el archivo /etc/nsswitch.conf y busque la línea que comienza con la palabra "hosts"? ¿Ves la palabra "archivos" en esta línea? En caso afirmativo, ¿es antes o después de la palabra "dns"?

En un sistema normal, esta línea debería ser algo así como

hosts      files dns

Si el suyo no está presente o en un orden diferente, ese podría ser su problema.

MelBurslan
fuente
Está presente y se ve asíhosts: files dns
user784637