Пошук хостів, який поважає / 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 адресу.
Роман Чепляка

@RomanCheplyaka - Дивіться відповідь eppesuig, яка показує, як за допомогою getent шукати лише IPv4 адреси: unix.stackexchange.com/a/71392/7453
slm

Відповіді:


4

Єдина команда, яку я знаю, що робить те, що ви хочете, це разрешение:

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

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


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

Для тих, хто дбає забути історію (тобто 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виводить десятковий формат.


0

Я використав свої чисті знання Perl і створив невеликий сценарій з поводженням з помилками:

/ 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";

Thx для Стефана Шазеласа для початкової ідеї

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.