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'

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:



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

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

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.


2

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


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ł

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.