Take the 2-minute tour ×

I have the following /etc/hosts file on a ubuntu 12.04 machine localhost 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

However the host command does not resolve the name puppetmaster correctly, while the telnet command is does

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
Connected to ec2-50-112-220-110.us-west-2.compute.amazonaws.com.
Escape character is '^]'.

Why does the host command not resolve entries in /etc/hosts?

share|improve this question
add comment

4 Answers

up vote 8 down vote accepted

The host-program uses libresolv to perform a DNS-query directly. E.g. it is not using gethostbyname.

Most programs, when attempting to connect to another host, invoke the gethostbyname or a similar function. It will obay the configuration of /etc/nsswitch.conf. This file has a line which in Ubuntu 12.04 defaults to the following:

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4

which means that it will first look up in /etc/hosts, then fall back to DNS queries.

If you want to perform a host lookup this way, you can do this with getent hosts. For example:

$ getent hosts serverfault.com  serverfault.com

I hope this helps.

share|improve this answer
Thanks Kvisle, but I'm still a little confused. The line in /etc/nsswitch.conf looked like this hosts: files dns and I changed it to hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4 however in both cases /etc/hosts is not queried, instead it appears direct dns queries are made. How can I ensure that /etc/hosts will be queried first when using a command like dig or host? –  user784637 Apr 11 '13 at 19:33
You can't. dig/host uses DNS directly. If you need to do a namelookup that checks the hosts-file first, you have to use getent hosts or something else that uses gethostbyname() –  Kvisle Apr 11 '13 at 19:35
Oh I see, my bad, I got it now =) –  user784637 Apr 11 '13 at 19:44
add comment

check the file /etc/nsswitch.conf and look for the line starting with word "hosts"? Do you see the word "files" on this line ? If yes, is it before or after the word "dns" ?

On a normal system, this line should be something like

hosts      files dns

if yours is not present or in different order, that might be your problem.

share|improve this answer
It's present and looks like this hosts: files dns –  user784637 Apr 11 '13 at 19:22
add comment

Because the host utility is exclusively a DNS lookup utility.

Most applications use the library calls getaddrinfo or gethostbyname. These libraries interrogate a file called /etc/nsswitch.conf to determine the lookup priority and policy of how to perform different lookups.

Typically /etc/nsswitch.conf contains the line

hosts:        files dns

Which tells a program to first interrogate /etc/hosts and then interrogate DNS if unsuccessful.

Since hosts does exclusively DNS lookups it does not peek into /etc/hosts to do the lookup.

share|improve this answer
add comment

You will find that dig and nslookup behave the same way as host.

The reason for this is that the purpose of all of these commands is to do DNS lookups, not to look in files.

Most other programs use the operating system's name resolver which consults /etc/nsswitch.conf and then (if required) /etc/resolv.conf to decide how to resolve the hostname you are requesting. (This is a simplification, there are other options.) The nsswitch.conf file usually puts precedence on local files rather than DNS.

share|improve this answer
add comment

Your Answer


