Host-Suche unter Berücksichtigung von / etc / hosts

19

Dienstprogramme mögen hostund diglassen Sie die IP-Adresse sehen, die dem Hostnamen entspricht.

Es gibt auch das getentDienstprogramm, mit dem Abfragen /etc/hostsoder andere NSS-Datenbanken durchgeführt werden können.

Ich bin auf der Suche nach einem praktischen Standard-Dienstprogramm (das beispielsweise in Debian verfügbar ist), das einen Hostnamen auflöst, unabhängig davon, wo er definiert ist.

Es sollte mehr oder weniger gleichwertig sein mit

ping "$HOST" | head -1 | perl -lne '/\((.*?)\)/ && print $1'
Roman Cheplyaka
quelle
5
Womit genau ist es falsch getent?
Patrick
2
Ja, ich glaube nicht, dass es praktischer sein könnte als getent.
Bratchley
@Patrick: hmm, ich habe nicht gemerkt, dass es getentauch in DNS aussieht (ich dachte, es schaut nur in /etc/hosts). Nun, da ich es ausprobiert habe, ist Folgendes falsch getent: Denn google.comes gibt eine einzelne Adresse zurück, und diese Adresse ist IPv6. Das ist nicht hilfreich, da ich in einem IPv4-Netzwerk bin und mein Befehl tatsächlich eine IPv4-Adresse ausgeben würde.
Roman Cheplyaka
@RomanCheplyaka - Siehe die Antwort von eppesuig, die zeigt, wie getent verwendet wird, um nur nach IPv4-Adressen zu suchen: unix.stackexchange.com/a/71392/7453
slm

Antworten:

4

Der einzige Befehl, von dem ich weiß, dass er das tut, was Sie wollen, ist resolveip:

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

Es kommt jedoch nur mit MySQL-Server, die möglicherweise nicht überall ideal zu installieren sind.

Georgyo
quelle
14

Wenn das Problem darin besteht, dass Sie diese Namen nicht mit ipv6 auflösen möchten, bitten Sie getent, nur ipv4 zu verwenden. Dadurch werden alle IPv4-Adressen aufgelistet:

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
quelle
Verwenden Sie für diejenigen, die den Verlauf vergessen möchten (z. B. IPv4) ahostsv6.
Luc
2
Verwenden Sie für diejenigen, die die Unterschiede zwischen IPv4 und IPv6 nicht berücksichtigen möchten getent ahosts google.com.
Mikko Rantalainen
6

Die Sache ist, es gibt mehrere APIs, um Hostnamen wie aufzulösen gethostbyname, getaddrinfound inet_ptoneinige von diesen können mehr als eine Adresse zurückgeben und / oder Sie können den gewünschten Adresstyp abfragen.

Wenn Sie einen portablen Weg suchen, um eine IPv4-Adresse zu erhalten, dann vielleicht:

perl -MSocket -le 'print inet_ntoa inet_aton shift' www.google.com
Stéphane Chazelas
quelle
2

(Diese Antwort gilt nur, wenn Sie als Root auf dem Computer angemeldet sind.)

Das hat mich früher auch geärgert, und dann habe ich standardisiert, dnsmasq auf allen meinen Rechnern auszuführen . Dnsmasq ist ein einfacher DNS-Cache. Als Nebeneffekt wird der Inhalt von /etc/hostsüber DNS bereitgestellt.

Gilles 'SO - hör auf böse zu sein'
quelle
2

gethostip -d name.domainaus dem syslinuxPaket auf Ubuntu (und wahrscheinlich Debian). -dgibt das Dezimalformat aus.

dan3
quelle
0

Ich habe mein reines Perl-Wissen genutzt und ein kleines Skript mit Fehlerbehandlung erstellt:

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

Vielen Dank an Stéphane Chazelas für die erste Idee

Daniel Alder
quelle