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?

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.


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.


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.



-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.


É presente e olha como estehosts: files dns
— user784637
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.