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'

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:



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

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

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.


2

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


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.