getaddrinfo () do shell? [duplicado]

7

Quando você chama ping name.domain , ele passa por ambos /etc/hosts e pelo resolvedor de DNS para obter um IP. Pode ser um IP codificado em /etc/hosts ou pode ser um do servidor DNS. Isso é feito chamando getaddrinfo () ou equivalente, não diretamente, é claro.

Como eu chamo getaddrinfo() do shell? Como eu reproduzo o efeito de utilitários de rede "normais" para obter um IP de um endereço?

Não se trata de usar dig / host , que só passam pelo DNS, ou getent , que passa apenas por hosts . Quero reproduzir o comportamento de aplicativo comum (por exemplo, ping ) quando ele recebe um nome que precisa resolver. Há outras perguntas sobre dig / host . Esta questão não é uma duplicata deles.

Atualização : aqui estão minhas descobertas (baseadas parcialmente em respostas a outros Qs)

  • no Ubuntu (e Debian?) há gethostip -d name.domain de syslinux .
  • perl -MSocket -le 'print inet_ntoa inet_aton shift' name.domain funciona de forma confiável e é mais tenso do que a resposta aceita.
  • O uso de getent may também funciona: getent ahostsv4 name.domain | grep STREAM | head -1 | cut -f1 -d' '

Isto parece ser o melhor que se pode fazer.

    
por dan3 03.11.2013 / 19:19

1 resposta

4

Se você tiver acesso ao Perl, eu rolei o meu (achei na internet e usei):

#!/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
}

Este código vem do SF Q & A intitulado: Utilitário de linha de comando do Linux para resolver nomes de host usando / etc / hosts primeiro .

Exemplos

$ ./gethostbyname.pl skinner
192.168.1.3

$ ./gethostbyname.pl www.google.com
74.125.225.84

$ ./gethostbyname.pl localhost
127.0.0.1

Eu usei o método acima quando o código estava sendo executado em várias máquinas Unix, não apenas no Linux e, portanto, getent não era uma opção.

getent

Eu sei que a página de manual do getent deixa você pensando que getent irá procurar apenas nos bancos de dados de arquivos, mas acredito que ele passa por quaisquer meios definidos em /etc/nsswitch.conf . Portanto, se ele indicar dns como um valor, acredito que ele interrogará o servidor DNS configurado em /etc/resolv.conf . Supondo que haja um definido nesse arquivo.

Nos meus testes eu não tenho uma entrada no meu arquivo, /etc/hosts , para o host "skinner" e ainda getent resolve tudo bem via DNS.

$ getent hosts skinner
192.168.1.3     skinner.bubba.net

$ grep skinner /etc/hosts
$
    
por 03.11.2013 / 19:40