Einfache Möglichkeit, die IP-Adresse vom Hostnamen mithilfe einer Unix-Shell abzurufen


12

Was ist der einfachste Weg, um die IP-Adresse von einem Hostnamen zu erhalten?

Ich dachte darüber nach, a zu versuchen pingund es von der Ausgabe zu analysieren. Dies scheint jedoch nicht sehr schön zu sein und wird wahrscheinlich nicht auf allen Systemen gleich funktionieren.

Ich habe ein bisschen gesucht und Lösungen mit gefunden nslookup, aber das funktioniert nicht für Hostnamen in /etc/hosts.


Ich frage mich immer noch ein bisschen, warum Unix-Shells nicht als Programmiersprachen gelten ...
Albert

Da Shell traditionell als Scripting und nicht als Programmierung angesehen wird;)
Tino

Antworten:


5

Dies können Sie mit Standardsystemaufrufen tun. Hier ist ein Beispiel in Perl:

use strict; use warnings;
use Socket;
use Data::Dumper;

my @addresses = gethostbyname('google.com');
my @ips = map { inet_ntoa($_) } @addresses[4 .. $#addresses];
print Dumper(\@ips);

erzeugt die Ausgabe:

$VAR1 = [
          '74.125.127.104',
          '74.125.127.103',
          '74.125.127.105',
          '74.125.127.106',
          '74.125.127.147',
          '74.125.127.99'
        ];

(Auf der Kommandozeile kann das gleiche Skript geschrieben werden: perl -MSocket -MData::Dumper -wle'my @addresses = gethostbyname("google.com"); my @ips = map { inet_ntoa($_) } @addresses[4 .. $#addresses]; print Dumper(\@ips)')

Sie können dies auch in anderen Sprachen tun - siehe Manpage für die Systemaufrufe unter man -s3 gethostbynameusw.


Cool, das geht. Esp., perl -MSocket -MData::Dumper -wle'my @addresses = gethostbyname("www.google.com"); my @ips = map { inet_ntoa($_) } @addresses[4 .. $#addresses]; print $ips[0]'.
Albert

Sehr seltsam, dass diese Antwort ein Programmcode ist ... :) Sieht fast aus wie eine Stackoverflow-Antwort. Gehört nicht wirklich zu Serverfault. Aber ich akzeptiere die Antwort trotzdem.
Albert

@ Albert: Nun, um fair zu sein: 1. Die Frage wurde ursprünglich auf SO gepostet und auf SF migriert, und 2. Die Art der Daten, die Sie suchen, muss mit etwas analysiert werden . Einige Leute halten Perl für eine bessere Form des Shell-Skripts: D
Ether

@ Andere sed -e '/some people consider Perl a better form/s/better/worse/'SCNR
Tino

11

host <hostname>

Ex:

serv ~ $ host stackoverflow.com
stackoverflow.com has address 69.59.196.211

Bearbeiten

Unter Linux (und zumindest einigen OS X-Varianten) können Sie möglicherweise Folgendes verwenden resolveip, das Teil des MySQL-Serverpakets ist:

/etc/hosts:
 ...
 127.0.0.1     localhost localhost.localdomain foo
 ...

serv ~ $ resolveip foo
IP address of foo is 127.0.0.1

Funktioniert auch nicht. (Für Gastgeber in /etc/hosts.) Versuchen host localhost.
Albert

serv ~ $ host localhost \n localhost has address 127.0.0.1

Hm, na ja, nicht hier. Ich bin gespannt, warum das bei dir funktioniert. Oder warum geht es mir nicht.
Albert

2
Siehe meine Bearbeitung - Sie könnten es versuchen resolveip.

Hm, resolveipist nicht standardmäßig auf meinem Debian installiert.
Albert

9

Dieser alte Beitrag scheint viele kreative Lösungen zu haben.

Wenn ich sicherstellen muss, dass auch darauf /etc/hostszugegriffen wird, verwende ich in der Regel

getent hosts somehost.com

Dies funktioniert, zumindest wenn `/etc/nsswitch.conf 'so konfiguriert wurde, dass Dateien verwendet werden (wie es normalerweise der Fall ist).


Schön und funktioniert auch für IPv6.
Tino

Und muss nicht Syslinux installieren!
Claudiu

Interessant ist, dass für einige IPs nichts zurückgegeben wird, während ahostsmehrzeilige Informationen zurückgegeben werden.
Akostadinov

7

Für IPv4 gibt es ein Standardprogramm, das mit dem Resolver einschließlich / etc / hosts sofort funktioniert:

host="localhost"
ip="`gethostip -d "$host"`"

Es ist Teil von Debian, installieren Sie es mit:

apt-get install syslinux

Für andere Protokolle als IPv4 (wie IPv6) kenne ich derzeit kein ähnliches Tool. Update: Aus diesem Grund habe ich gerade ein kleines Tool geschrieben, das auch IPv6 auflösen kann:

https://github.com/hilbix/misc/blob/master/src/ipof.c

Es ist gedacht für eine schnelle und schmutzige Shell-Nutzung gethostip, erlaubt aber auch IPv6:

ip="`ipof -6 -- heise.de`"

Es kann auch interaktiv verwendet werden, zum Beispiel:

ipof -a -d -x -v -h -

HTH


Kam hierher, um diese Antwort zu geben.
Nicht jetzt

3

Nun, meine aktuelle Lösung:

ping -c1 -n www.google.com | head -n1 | sed "s/.*(\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\)).*/\1/g"

Dies gibt nicht nur die IP: PING www.l.google.com (72.14.234.104): 56 Datenbytes
Federico Klez Culloca

Ja, anscheinend sedverhält sich das auf jedem System etwas anders. :) Wie nervig. Ich habe es ein bisschen geändert, ich denke, es sollte jetzt überall funktionieren.
Albert

2

Warum nicht dig +short hostname?

(DNS abfragen)


Dies wird nicht /etc/hostsberücksichtigt.
Janne Pikkarainen

DNS soll eine endgültige Quelle für die Namensauflösung sein. Wenn Sie die Hostdatei zum Überschreiben verwenden, ist dies in Ordnung. Aber das ist eine
Außerkraftsetzung

Ich weiß, aber die ursprüngliche Frage wollte / etc / hosts :)
Janne Pikkarainen

sicher genug; Mein Leseverständnis
schlägt

0

Auf einigen Unices funktioniert Folgendes:

arp <hostname>

Unter Mac OS X erhalte ich beispielsweise Folgendes:

arp My-iMac.local
My-iMac.local (192.168.1.2) -- no entry

Nun, es findet den Eintrag, listet aber nur seinen MAC auf, nicht seine IP. :)
Albert

Ah, arp -n hostnamezeigt die IP.
Albert

Nur funktioniert dieser Weg nicht für Server außerhalb des Netzwerks. : P
Albert

0

Verwenden pingist nicht so schlecht, da Sie im Allgemeinen keine starken Abhängigkeiten haben.

Hier ist die Funktion, die ich auf Linux-Systemen verwendet habe:

getip () { ping -c 1 -t 1 $1 | head -1 | cut -d ' ' -f 3 | tr -d '()' ; }

-1
nmap -sP 192.168.1.0/24|grep SEARCHED_HOSTNAME|sed -n 's/.*[(]\([0-9\.]*\)[)].*/\1/p'
  • Nmap erhält von Ihrem Subnetz (192.168.1.0 oder was auch immer) die Adressen
  • Mit grep erhalten Sie nur die Zeile des Hostnamens, den Sie suchen
  • Mit sed bekommst du nur die IP-Adresse in den Klammern

2
Ein bisschen mehr Informationen über die verschiedenen Schalter und warum verwendet würde Ihre Antwort hinzufügen
Dave M

Es gibt mindestens vier verschiedene Gründe, warum diese Antwort nicht funktioniert. Sie treffen Annahmen über den Bereich der IP-Adressen, innerhalb dessen die Antwort gefunden wird. Es ist ineffizient, da viel mehr Netzwerkverkehr erzeugt wird, als benötigt wird. Dies funktioniert nur für IP-Adressen, die auf Tests reagieren. Es wird davon ausgegangen, dass Reverse-DNS genau die gleichen Zuordnungen wie Forward-DNS enthält.
Kasperd
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.