Wyszukiwanie hosta uwzględniające / etc / hosts

19

Narzędzia takie jak hosti digpozwalają zobaczyć adres IP odpowiadający nazwie hosta.

Istnieje również getentnarzędzie, którego można użyć do zapytania /etc/hostslub innych baz danych NSS.

Szukam wygodnego standardowego narzędzia (które jest dostępne w Debianie, powiedzmy), które rozwiązuje nazwę hosta niezależnie od tego, gdzie jest zdefiniowane.

Powinno to być mniej więcej równoważne z

ping "$HOST" | head -1 | perl -lne '/\((.*?)\)/ && print $1'
Roman Cheplyaka
źródło
5
Z czym dokładnie jest nie tak getent?
Patrick
2
Tak, nie sądzę, żeby mogło być wygodniej niż getent.
Bratchley,
@Patrick: hmm, nie zdawałem sobie sprawy, getentże wygląda również w DNS (myślałem, że to tylko wygląda /etc/hosts). Teraz, gdy go wypróbowałem, oto co jest nie tak z getent: google.componieważ zwraca pojedynczy adres, a ten adres to IPv6. Co nie jest pomocne, ponieważ jestem w sieci IPv4, a moje polecenie faktycznie wydrukuje adres IPv4.
Roman Cheplyaka
@RomanCheplyaka - Zobacz odpowiedź eppesuig, która pokazuje, jak używać getent do wyszukiwania tylko adresów IPv4: unix.stackexchange.com/a/71392/7453
slm

Odpowiedzi:

4

Jedyne znane mi polecenie, które robi to, co chcesz, to resolip:

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

Jest on jednak dostarczany tylko z serwerem mysql, który może nie być idealny do instalacji wszędzie.

Georgyo
źródło
14

Jeśli problem polega na tym, że nie chcesz rozwiązywać tych nazw przy użyciu ipv6, po prostu poproś getent o użycie tylko ipv4. Spowoduje to wyliczenie wszystkich adresów 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
źródło
Dla tych, którzy chcą zapomnieć o historii (np. IPv4), użyj ahostsv6.
Luc
2
Dla tych, którzy chcą uniknąć uwzględnienia różnic między IPv4 i IPv6, użyj getent ahosts google.com.
Mikko Rantalainen
6

Chodzi o to, że istnieje kilka interfejsów API do rozpoznawania nazw hostów gethostbyname, getaddrinfoa inet_ptonniektóre z nich mogą zwrócić więcej niż jeden adres i / lub możesz zapytać o typ adresu, który chcesz.

Jeśli chcesz w przenośny sposób uzyskać jeden adres IPv4, może:

perl -MSocket -le 'print inet_ntoa inet_aton shift' www.google.com
Stéphane Chazelas
źródło
2

(Ta odpowiedź dotyczy tylko użytkowników root na komputerze).

Byłem tym również zirytowany, a następnie ustandaryzowałem się, uruchamiając dnsmasq na wszystkich moich komputerach. Dnsmasq to lekka pamięć podręczna DNS. Dodatkową korzyścią jest to, że obsługuje zawartość usługi /etc/hostsDNS.

Gilles „SO- przestań być zły”
źródło
2

gethostip -d name.domainz syslinuxpakietu Ubuntu (i prawdopodobnie Debiana). -dwypisuje format dziesiętny.

dan3
źródło
0

Wykorzystałem swoją czystą perlową wiedzę i napisałem mały skrypt z obsługą błędów:

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

Dziękujemy Stéphane'owi Chazelasowi za wstępny pomysł

Daniel Alder
źródło