Pesquisa de host que respeita / etc / hosts

19

Os utilitários gostam hoste digpermitem que você veja o endereço IP correspondente ao nome do host.

Há também o getentutilitário que pode ser usado para consultar /etc/hostsou outros bancos de dados NSS.

Estou procurando por um utilitário padrão conveniente (que está disponível no Debian, por exemplo) que resolve um nome de host, independentemente de onde ele está definido.

Deve ser mais ou menos equivalente a

ping "$HOST" | head -1 | perl -lne '/\((.*?)\)/ && print $1'
Roman Cheplyaka
fonte
5
O que exatamente está errado getent?
Patrick
2
Sim, eu não acho que poderia ser mais conveniente do que getent.
Bratchley
@ Patrick: hmm, eu não percebi getenttambém parece no DNS (eu pensei que só parece /etc/hosts). Agora que eu tentei, eis o que há de errado com getent: pois google.com, ele retorna um único endereço e esse endereço é IPv6. O que não é útil, pois estou em uma rede IPv4 e meu comando realmente imprime um endereço IPv4.
Roman Cheplyaka
@RomanCheplyaka - Veja a resposta da eppesuig que mostra como usar o getent para procurar apenas endereços IPv4: unix.stackexchange.com/a/71392/7453
slm

Respostas:

4

O único comando que eu sei que faz o que você deseja é o resolveip:

http://linux.die.net/man/1/resolveip

No entanto, ele vem apenas com o mysql-server, o que pode não ser o ideal para instalação em qualquer lugar.

Georgyo
fonte
14

Se o problema é que você não deseja resolver esses nomes usando o ipv6, basta pedir ao getent para usar apenas o ipv4. Isso enumerará todos os endereços ipv4:

giuseppe@blatta:~$ getent ahostsv4 www.google.com | cut -d' ' -f1 | sort -u
173.194.40.80
173.194.40.81
173.194.40.82
173.194.40.83
173.194.40.84
eppesuig
fonte
Para quem se importa de esquecer a história (por exemplo, IPv4), use ahostsv6.
Luc
2
Para aqueles que querem evitar considerar as diferenças entre IPv4 e IPv6, use getent ahosts google.com.
Mikko Rantalainen
6

O problema é que existem várias APIs para resolver nomes de host gethostbyname, getaddrinfoe inet_ptonalgumas delas podem retornar mais de um endereço e / ou você pode consultar o tipo de endereço que deseja.

Se você deseja uma maneira portátil de obter um endereço IPv4, talvez:

perl -MSocket -le 'print inet_ntoa inet_aton shift' www.google.com
Stéphane Chazelas
fonte
2

(Esta resposta se aplica apenas se você é root na máquina.)

Eu também costumava me incomodar com isso e depois padronizava a execução do dnsmasq em todas as minhas máquinas. Dnsmasq é um cache DNS leve. Como um benefício colateral, ele serve o conteúdo do /etc/hostsover DNS.

Gilles 'SO- parar de ser mau'
fonte
2

gethostip -d name.domaindo syslinuxpacote no Ubuntu (e provavelmente Debian). -dgera o formato decimal.

dan3
fonte
0

Eu usei meu conhecimento puro de perl e fiz um pequeno script com tratamento de erros:

/ usr / local / bin / gethostip:

#!/usr/bin/perl

# inspired by: /unix/71379/host-lookup-that-respects-etc-hosts#71393

use strict;
use Socket;

my $name = $ARGV[0];
if ($name eq '') {
  print STDERR "Usage: gethostip <hostname>\n";
  exit 1;
}
my $ip = inet_aton($name);
die("Unable to resolve host name $name") if ($ip eq '');
my $ipstr = inet_ntoa($ip);
print "$ipstr\n";

Agradecemos a Stéphane Chazelas pela ideia inicial

Daniel Alder
fonte