Поиск хоста, который учитывает / etc / hosts

19

Утилиты любят hostи digпозволяют увидеть IP-адрес, соответствующий имени хоста.

Существует также getentутилита, которая может использоваться для запроса /etc/hostsили других баз данных NSS.

Я ищу удобную стандартную утилиту (которая доступна, скажем, в Debian), которая разрешает имя хоста независимо от того, где оно определено.

Это должно быть более или менее эквивалентно

ping "$HOST" | head -1 | perl -lne '/\((.*?)\)/ && print $1'
Роман Чепляка
источник
5
Что именно не так с getent?
Патрик
2
Да, я не думаю, что это может быть более удобным, чем гетент.
Братчли
@Patrick: хм, я не понимал, getentтакже смотрит в DNS (я думал, что он только смотрит /etc/hosts). Теперь, когда я попробовал это, вот что не так getent: google.comон возвращает один адрес, и этот адрес - IPv6. Что не помогает, так как я нахожусь в сети IPv4, и моя команда фактически напечатает адрес IPv4.
Роман Cheplyaka
@RomanCheplyaka - См eppesuig Ответим , что показывает , как использовать getent только ищет адреса IPv4: unix.stackexchange.com/a/71392/7453
ОДС

Ответы:

4

Единственная известная мне команда, которая делает то, что вам нужно, - resolip:

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

Однако он поставляется только с mysql-сервером, который может быть не идеальным для установки везде.

Georgyo
источник
14

Если проблема в том, что вы не хотите разрешать эти имена с помощью ipv6, просто попросите getent использовать только ipv4. Это будет перечислять все адреса 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
источник
Для тех, кто хочет забыть историю (например, IPv4), используйте ahostsv6.
Люк
2
Для тех, кто хочет избежать различий между IPv4 и IPv6, используйте getent ahosts google.com.
Микко Ранталайнен,
6

Дело в том, что есть несколько API для разрешения имен хостов, например gethostbyname, getaddrinfoи inet_ptonнекоторые из них могут возвращать более одного адреса, и / или вы можете запросить тип адреса, который вы хотите.

Если вам нужен портативный способ получить один IPv4-адрес, то, возможно:

perl -MSocket -le 'print inet_ntoa inet_aton shift' www.google.com
Стефан Шазелас
источник
2

(Этот ответ применим, только если вы являетесь пользователем root на компьютере.)

Меня это тоже раздражало, а потом я стандартизировал запуск dnsmasq на всех моих машинах. Dnsmasq - это легкий DNS-кеш. Дополнительным преимуществом является содержание /etc/hostsболее DNS.

Жиль "ТАК - прекрати быть злым"
источник
2

gethostip -d name.domainиз syslinuxпакета на Ubuntu (и, вероятно, Debian). -dвыводит десятичный формат.

dan3
источник
0

Я использовал свои знания Perl и сделал небольшой скрипт с обработкой ошибок:

/ USR / местные / бен / 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";

Спасибо Стефану Шазеласу за первоначальную идею

Даниэль Алдер
источник