Estou no shell e quero saber os endereços IP correspondentes para um nome de host.
Eu sei que poderia conseguir isso através de Perl, PHP, Python ou uma série de 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 por aí getaddrinfo()
.
Estou errado? Existe algum? host
, dig
e getent
não conte, quero algo que use a libc e atue de acordo com /etc/nsswitch.conf
, e algo que provavelmente esteja instalado em qualquer sistema (linux) por padrão.
Mudou-se para cá dehttps://stackoverflow.com/questions/20211326/is-there-a-standard-command-line-tool-to-do-a-hostname-lookup
Answer: Eu estava errado, getent
não olha exclusivamente /etc/hosts
, na verdade faz uma pesquisa adequada.
Responder1
a ferramenta tradicional para fazer pesquisas de nomes de host é o nslookup do bind, mas está sendo substituído pelo dig. ambas as ferramentas são específicas do DNS e não usam o nsswitch. getent hosts usa nsswitch, mas muito menos usado.
Responder2
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, arp
é muito improvável que não esteja disponível em nenhum servidor que faça resolução de nomes. Como arp
segue nsswitch.conf
as configurações, usa apenas libc
, está disponível em qualquer sistema Linux/Unix e fornece uma saída que parece ser consistente entre as implementações, analisar sua saída resolveria o problema:
$ arp stackoverflow.com | sed -e 's/.*(//' -e 's/).*$//'
198.252.206.16
Aqui está uma função shell que usa esse método, evitando um problema com o arp do Linux, que muda 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/).*$//'
)
}