Por que o comando host não resolve entradas no / etc / hosts?

25

Eu tenho o seguinte /etc/hostsarquivo em uma 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

No entanto, o comando host não resolve o nome puppetmastercorretamente, enquanto o comando 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 '^]'.

Por que o comando host não resolve entradas no / etc / hosts?

user784637
fonte

Respostas:

52

O hostprograma usa libresolvpara executar uma consulta DNS diretamente, ou seja, não usa gethostbyname.

A maioria dos programas, ao tentar se conectar a outro host, invoca a gethostbynamechamada do sistema ou uma função semelhante. Esta função obedece à configuração de /etc/nsswitch.conf. Este arquivo possui uma linha que no Ubuntu 12.04 é padronizada da seguinte forma:

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4

o que significa que ele será usado primeiro /etc/hostse depois retornará às consultas DNS.

Se você deseja executar uma pesquisa de host dessa maneira, é possível fazer isso com getent hosts. Por exemplo:

$ getent hosts serverfault.com
198.252.206.16  serverfault.com

Eu espero que isso ajude.

Kvisle
fonte
2
Obrigado Kvisle, mas ainda estou um pouco confuso. A linha /etc/nsswitch.confficou assim hosts: files dnse eu a mudei para, hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4no entanto, em ambos os casos, /etc/hostsnão é consultada, mas parece que são feitas consultas diretas ao DNS. Como garantir que a /etc/hostsconsulta seja feita primeiro ao usar um comando como digou host?
precisa saber é o seguinte
4
Você não pode. dig / host usa DNS diretamente. Se você precisa fazer uma namelookup que verifica os anfitriões arquivo em primeiro lugar, você tem que usar getent hostsou outra coisa que usosgethostbyname()
Kvisle
Oh eu vejo, meu mau, eu entendi agora =)
user784637
1
Eu acredito que hoje em dia a pessoa deve estar usando getent ahostsem vez de getent hostsporque getent hostsusos gethostbyaddr()ou gethostbyname*()que estão obsoletos. Se eu entendi corretamente, getent hostsemula a idade dos programas UNIX C usados ​​e getent ahostsemula a maneira como os programas moderm devem funcionar.
Mikko Rantalainen 02/10/19
Mas existe uma maneira de fazer com que o comando host use também o / etc / hosts?
Kornel
10

Porque o hostutilitário é exclusivamente um utilitário de pesquisa de DNS.

A maioria dos aplicativos usa as chamadas da biblioteca getaddrinfoou gethostbyname. Essas bibliotecas interrogam um arquivo chamado /etc/nsswitch.confpara determinar a prioridade de pesquisa e a política de como executar pesquisas diferentes.

Normalmente /etc/nsswitch.confcontém a linha

hosts:        files dns

O que instrui um programa a interrogar primeiro /etc/hostse depois interrogar o DNS se malsucedido.

Como os hosts fazem pesquisas exclusivamente de DNS, elas não /etc/hostsfazem a pesquisa.

Matthew Ife
fonte
3

Você encontrará isso dige nslookupse comportará da mesma maneira que host.

A razão para isso é que o objetivo de todos esses comandos é fazer pesquisas de DNS, não em arquivos.

A maioria dos outros programas usa o resolvedor de nomes do sistema operacional, que é consultado /etc/nsswitch.confe depois (se necessário) /etc/resolv.confpara decidir como resolver o nome do host que você está solicitando. (Isso é uma simplificação, existem outras opções.) O nsswitch.confarquivo geralmente coloca precedência nos arquivos locais, e não no DNS.

Ladadadada
fonte
-1

verifique o arquivo /etc/nsswitch.conf e procure a linha que começa com a palavra "hosts"? Você vê a palavra "arquivos" nesta linha? Se sim, é antes ou depois da palavra "dns"?

Em um sistema normal, essa linha deve ser algo como

hosts      files dns

se o seu não estiver presente ou em ordem diferente, esse pode ser o seu problema.

MelBurslan
fonte
É presente e olha como estehosts: files dns
user784637