a ferramenta tradicional para fazer pesquisas de nomes de host é nslookup de bind, mas está sendo substituída por dig. ambas as ferramentas são dns speciffic e não usam nsswitch. Os hosts getent usam nsswitch, mas muito menos usados.
Estou no shell e quero saber o (s) endereço (s) IP correspondente (s) para um nome de host.
Eu sei que poderia passar por Perl, PHP, Python ou várias outras linguagens de script (provavelmente até mesmo awk!), e esta será minha solução alternativa, mas estou surpreso que parece não haver nenhuma ferramenta de linha de comando para fazer isso, nenhum wrapper simples em torno de getaddrinfo()
.
Estou errado? Existe um? host
, dig
e getent
não contam, eu quero algo que usa a libc e age de acordo com /etc/nsswitch.conf
, e algo que provavelmente é instalado em qualquer sistema (linux) por padrão.
Movido aqui de link
Resposta: Eu estava errado, getent
não procura exclusivamente em /etc/hosts
, ele realmente faz uma pesquisa adequada.
getent
é certamente a ferramenta certa para o trabalho, mas infelizmente não está disponível em todos os lugares, uma das razões é que não é obrigatório ser indefinido pelo POSIX.
Por outro lado, embora não seja especificado pelo padrão, é muito improvável que arp
esteja disponível em qualquer servidor que faça a resolução de nomes. Como arp
segue as configurações de nsswitch.conf
, só usa libc
, está disponível em qualquer sistema Linux / Unix e fornece uma saída que parece ser consistente entre implementações, analisando sua saída que faria o trabalho:
$ arp stackoverflow.com | sed -e 's/.*(//' -e 's/).*$//'
198.252.206.16
Aqui está uma função de shell que usa esse método, evitando um problema com o Linux arp que alterna para um formato de saída diferente em alguns casos:
resolve()
{
: ${1:?Usage: resolve name}
(
PATH=$PATH:/usr/sbin
ao=$(arp $1)
[ "$(echo "$ao"|grep HWaddress)" ] && ao=$(arp -a $1)
echo "$ao" | sed -e 's/.*(//' -e 's/).*$//'
)
}