O único comando que sei que faz o que você quer é resolverip:
No entanto, ele vem apenas com o mysql-server, que pode não ser ideal para instalar em qualquer lugar.
Utilitários como host
e dig
permitem que você veja o endereço IP correspondente ao nome do host.
Há também o utilitário getent
que pode ser usado para consultar /etc/hosts
ou outros bancos de dados NSS.
Estou procurando 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'
O único comando que sei que faz o que você quer é resolverip:
No entanto, ele vem apenas com o mysql-server, que pode não ser ideal para instalar em qualquer lugar.
Se o problema é que você não deseja resolver esses nomes usando o ipv6, peça ao getent para usar somente o ipv4. Isto irá 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
O problema é que existem várias APIs para resolver nomes de host, como gethostbyname
, getaddrinfo
e inet_pton
, e algumas delas podem retornar mais de um endereço e / ou você pode consultar o tipo de endereço desejado. / p>
Se você quiser uma maneira portátil de obter um endereço IPv4 um , talvez:
perl -MSocket -le 'print inet_ntoa inet_aton shift' www.google.com
(Esta resposta só se aplica se você estiver root na máquina.)
Eu costumava ficar aborrecido com isso também, e então eu padronizava a execução de dnsmasq em todas as minhas máquinas. O Dnsmasq é um cache DNS leve. Como um benefício secundário, ele serve o conteúdo de /etc/hosts
sobre o DNS.
gethostip -d name.domain
do pacote syslinux
no Ubuntu (e provavelmente no Debian). -d
imprime o formato decimal.
Eu usei meu conhecimento perl puro e fiz um pequeno script com tratamento de erros:
/ usr / local / bin / gethostip:
#!/usr/bin/perl
# inspired by: https://unix.stackexchange.com/questions/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";
Thx para Stéphane Chazelas pela idéia inicial