it-swarm.com.de

Linux-Befehlszeilenprogramm zum Auflösen von Hostnamen zuerst mit / etc / hosts

Es gibt verschiedene Befehlszeilenprogramme zum Auflösen von Hostnamen (Host, Dig, nslookup). Alle verwenden jedoch ausschließlich Nameserver, während Anwendungen im Allgemeinen in /etc/hosts zuerst (mit gethostbyname glaube ich).

Gibt es ein Befehlszeilenprogramm zum Auflösen von Hostnamen, das sich wie eine normale Anwendung verhält, und daher in /etc/hosts zuerst und erst dann einen Nameserver fragen?

(Ich bin mir bewusst, dass es wahrscheinlich 3 Zeilen c sein würde, aber ich brauche es in einem etwas portablen Shell-Skript.)

37
Zulan

Dies wird leicht mit getent erreicht:

getent hosts 127.0.0.1

getent sucht nach allen in nsswitch.conf.

57
womble

Ein Werkzeug, das funktionieren würde, ist getent . Sie könnten also getent hosts www.google.com, oder getent hosts localhost. Es werden Einträge aus den Datenbanken abgerufen, wie in Ihrer Name Service Switch-Konfiguration angegeben /etc/nsswitch.conf .

26
Zoredache

Sie können einen gethostbyname () (veralteten) Wrapper wie folgt verwenden:

python -c 'import socket;print socket.gethostbyname("www.google.com")'

Oder ein getaddrinfo () - Wrapper wie:

python -c 'import socket;print socket.getaddrinfo("www.google.com","http")[0][4][0]'

Beachten Sie, dass getaddrinfo alle Instanzen als Liste zurückgibt. Der letzte Teil des Befehls wählt nur das erste Tupel aus. Dies kann auch IPv6-Adressen zurückgeben.

8

resolveip wird dies tun.

Seltsamerweise ist es Teil der MySQL-Server-Pakete unter RHEL und Ubuntu.

6
cjc

Sie können [Ihre Lieblingssprache hier] verwenden, um ein Skript zu schreiben, das getnameinfo aufruft. So sollten Binärdateien (wie Ping) funktionieren, damit Sie die gleiche Behandlung erhalten.

6
Kyle Smith

Verwenden getent ahosts, zum Beispiel:

$ getent ahosts www.google.com | sed -n 's/ *STREAM.*//p'
216.58.210.196
2a00:1450:4006:803::2004

Sie erhalten alle IPv4- und IPv6-Adressen über den glibc-Resolver (also mit /etc/hosts zuerst, wie normalerweise in /etc/nsswitch.conf).

Verwende nicht getent hosts, da Sie entweder IPv6- oder IPv4-Adressen (nicht beide) erhalten und das ausgewählte Protokoll möglicherweise nicht funktioniert. In der Tat werden IPv6-Adressen im Allgemeinen bevorzugt, aber an einigen Stellen werden IPv6-Daten von den Routern gefiltert (nicht unterstützt).

6
vinc17

"gethostbyname" Befehlszeilenversion :

#!/usr/bin/Perl
use Socket;

$Host = shift @ARGV;
die("usage: gethostbyname hostname\n") unless(defined($Host));

$packed_ip = gethostbyname($Host);

if (defined $packed_ip) {
    $ip_address = inet_ntoa($packed_ip);
    print "$ip_address\n";
    exit 0
} else {
    warn "$Host not found\n";
    exit 1
}
3
Erik Aronesty

Sie könnten wirklich hackig sein und arp verwenden:

arp -n somehostname | tr -d '()' | awk '{print $2}'

aber das wäre wirklich hässlich, also solltest du das nicht tun.

2
Paul M

getent hosts ist kaputt. Es bevorzugt IPv6-Adressen, gai.conf sollte so konfiguriert sein, dass IPv4 bevorzugt wird, aber ....

Das Perl gethostbyname verwendet die Priorität in /etc/nsswitch.conf

hosts: files dns

Das funktioniert also wie getent hosts sollte für mich arbeiten.

Ebenfalls:

Perl -e 'use Socket; print inet_ntoa(inet_aton("www.google.com")) . "\n";'

sollte arbeiten.

2
Jan Wortelboer

Versuche dies:

if [ `grep -c "hostname" /etc/hosts` -ge 1 ]; then
    ip=`awk '/hostname/ { print $1 }' /etc/hosts`
else
    ip=`Host hostname | awk '/hostname has address/ { print $4 }'`
fi
1
quanta