Isso é facilmente alcançado com getent
:
getent hosts 127.0.0.1
getent
fará pesquisas para qualquer tipo de dados configurado em nsswitch.conf
.
Existem vários utilitários de linha de comando para resolver nomes de hosts ( host
, dig
, nslookup
), mas todos usam exclusivamente servidores de nomes, enquanto os aplicativos em geral procuram /etc/hosts
(usando gethostbyname, acredito) .
Existe um utilitário de linha de comando para resolver nomes de host que se comportam como um aplicativo normal, procurando em /etc/hosts
primeiro e apenas perguntando a um servidor de nomes?
(Eu estou ciente de que provavelmente seria como 3 linhas de c, mas eu preciso dentro de um script de shell um tanto portável.)
Uma ferramenta que funcionaria é getent
. Então você pode usar getent hosts www.google.com
ou getent hosts localhost
. Ele irá recuperar as entradas dos bancos de dados, conforme especificado em sua configuração Name Service Switch /etc/nsswitch.conf
.
Você pode usar um wrapper gethostbyname () (descontinuado) como:
python -c 'import socket;print socket.gethostbyname("www.google.com")'
Ou um wrapper getaddrinfo () como:
python -c 'import socket;print socket.getaddrinfo("www.google.com","http")[0][4][0]'
Observe que getaddrinfo retornará todas as instâncias como uma lista. A última parte do comando seleciona apenas a primeira tupla. Isso também pode retornar endereços IPv6.
resolveip
fará isso.
Curiosamente, é parte dos pacotes mysql-server no RHEL e no Ubuntu.
Você pode usar [sua língua favorita aqui] para escrever um script que chame getnameinfo . É assim que os binários (como o ping) devem estar fazendo isso, então você tem certeza de obter o mesmo tratamento.
Use getent ahosts
, por exemplo:
$ getent ahosts www.google.com | sed -n 's/ *STREAM.*//p'
216.58.210.196
2a00:1450:4006:803::2004
Você obterá todos os endereços IPv4 e IPv6 por meio do resolvedor glibc (portanto, usando /etc/hosts
primeiro, como normalmente configurado em /etc/nsswitch.conf
).
Não use getent hosts
, pois ele fornecerá endereços IPv6 ou IPv4 (não ambos), e o protocolo escolhido pode não ser aquele que não funciona. De fato, os endereços IPv6 são geralmente preferidos, mas em alguns lugares, os dados IPv6 são filtrados (não suportados) pelos roteadores.
"gethostbyname" versão da linha de comando :
#!/usr/bin/perl
use Socket;
$host = shift @ARGV;
die("usage: gethostbyname hostname\n") unless(defined($host));
$packed_ip = gethostbyname($host);
if (defined $packed_ip) {
$ip_address = inet_ntoa($packed_ip);
print "$ip_address\n";
exit 0
} else {
warn "$host not found\n";
exit 1
}
Você pode ser realmente hacky e usar arp
:
arp -n somehostname | tr -d '()' | awk '{print $2}'
mas isso seria realmente feio, então você não deveria fazer isso.
getent hosts
está corrompido. Ele prefere endereços IPv6, gai.conf
deve ser configurado para preferir o ipv4, mas ....
O Perl gethostbyname
usa a precedência em /etc/nsswitch.conf
hosts: files dns
Então, isso funciona como getent hosts
deve funcionar para mim.
Além disso:
perl -e 'use Socket; print inet_ntoa(inet_aton("www.google.com")) . "\n";'
deve funcionar.
Tente isto:
if [ 'grep -c "hostname" /etc/hosts' -ge 1 ]; then
ip='awk '/hostname/ { print $1 }' /etc/hosts'
else
ip='host hostname | awk '/hostname has address/ { print $4 }''
fi
O comando a seguir executará a pesquisa via DNS / etc / hosts por meio da pesquisa direta do servidor DNS.
ping -W2 -c1 google.com | grep PING | sed -r "s/^[^\(]*\(([\.0-9]*)\).*//"
Este comando tentará fazer o ping de um domínio (neste caso, google.com) uma vez com um tempo limite de espera de 2 segundos, obter a primeira linha do comando PING que indicará "PING google.com (216.58.199.36) 56 (84) bytes de dados ", então use o Stream Editor (sed) para detectar o primeiro conjunto de colchetes e extrair os dados dentro dele, que é o endereço IP que estamos procurando.
OBSERVAÇÃO: a expressão regex não funcionará se houver parênteses (parênteses circulares) no URL, mas isso seria um caso raro.