Utilitário de linha de comando do Linux para resolver nomes de host usando / etc / hosts primeiro

31

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

    
por Zulan 22.08.2011 / 12:49

11 respostas

49

Isso é facilmente alcançado com getent :

getent hosts 127.0.0.1

getent fará pesquisas para qualquer tipo de dados configurado em nsswitch.conf .

    
por 22.08.2011 / 13:06
24

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 .

    
por 19.03.2012 / 20:53
6

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.

    
por 19.03.2012 / 21:06
5

resolveip fará isso.

Curiosamente, é parte dos pacotes mysql-server no RHEL e no Ubuntu.

    
por 19.03.2012 / 20:53
5

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.

    
por 19.03.2012 / 21:06
4

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.

    
por 03.10.2016 / 17:17
2

"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
}
    
por 22.04.2013 / 19:43
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.

    
por 28.06.2014 / 18:23
1

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.

    
por 24.09.2015 / 08:16
0

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
    
por 22.08.2011 / 13:29
-1

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.

    
por 31.07.2016 / 02:49