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'

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:



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

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

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.


2

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


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.