Pourquoi la commande host ne résout-elle pas les entrées dans /etc/hosts ?

J’ai le fichier /etc/hosts suivant sur une machine 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

Cependant, la commande host ne résout pas correctement le nom puppetmaster, alors que la commande telnet le fait :

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

Pourquoi la commande host ne résout-elle pas les entrées dans /etc/hosts ?

Le programme host utilise libresolv pour effectuer une requête DNS directement, c’est-à-dire qu’il n’utilise pas gethostbyname.

La plupart des programmes, lorsqu’ils tentent de se connecter à un autre hôte, invoquent l’appel système gethostbyname ou une fonction similaire. Cette fonction obéit à la configuration de /etc/nsswitch.conf. Ce fichier a une ligne qui, sous Ubuntu 12.04, a par défaut la valeur suivante :

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4

ce qui signifie qu’il utilisera d’abord /etc/hosts, puis se rabattra sur les requêtes DNS.

Si vous voulez effectuer une recherche d’hôte de cette manière, vous pouvez le faire avec getent hosts. Par exemple :

$ getent hosts serverfault.com
198.252.206.16  serverfault.com

J’espère que cela vous aide.