Wie kann ich einen Hostnamen in eine IP-Adresse in einem Bash-Skript auflösen?

Was ist die prägnanteste Methode, um einen Hostnamen in eine IP-Adresse in einem Bash-Skript aufzulösen? Ich verwende Arch Linux .

Kommentare

  • Schade, dass die Antwort getent <ahosts|ahostsv4|ahostsv6|hosts> <hostname> ist irgendwo dort unten in der Nähe des Bodens. Es ist ‚ das einfachste, erfordert keine zusätzlichen Pakete und ist einfacher auch aus einem Bash-Skript zu analysieren.
  • @ 0xC0000022L: Die neue Schande ist, dass diese Antwort getent hosts somehost vorschlägt, wenn dieses ausführt, während auf somehost erzeugt eine IPv6-Adresse , die sich von den meisten anderen Tools unterscheidet (ping, ssh zumindest) Namen auflösen und einige Dinge kaputt machen. Verwenden Sie die ahosts anstelle von hosts.
  • @j_random_hacker: Wer hält Sie davon ab, speziell IPv4 anzufordern (ahostsv4) oder IPv6-Adressen (ahostsv6)? Persönlich finde ich nichts falsch an der unspezifischen Anfrage, IPv6 zurückzugeben. Ihr Code sollte vorbereitet sein. IPv6 gibt es seit mehr als 20 Jahren.
  • @ 0xC0000022L: Niemand “ hält mich “ von dies zu tun, aber die Antwort schlägt ausdrücklich hosts vor, und bis jetzt haben 4 Personen den Kommentar von vinc17 ‚, der den durch “ plötzlich IPv6 „. Die Vorbereitung auf IPv6 ist nicht immer das Problem: Viele Programme benötigen eine Möglichkeit, um festzustellen, ob sich zwei Namen / Adressen auf denselben Host beziehen. Sie können entweder einen einfachen String-Abgleich verwenden oder sie müssen viel über das Netzwerk wissen, um die Antwort “ true “ zu finden. Letzteres ist ein Minenfeld, so dass viele Programme und Systeme von Drittanbietern – über die ich keine Kontrolle habe – das erstere verwenden.

Antwort

Sie können getent verwenden, das mit glibc geliefert wird (Sie haben es also mit ziemlicher Sicherheit unter Linux). . Dies wird mit gethostbyaddr / gethostbyname2 behoben und überprüft daher auch /etc/hosts / NIS / etc:

getent hosts unix.stackexchange.com | awk "{ print $1 }" 

Oder Wie Heinzi weiter unten sagte, können Sie dig mit dem Argument +short verwenden (DNS-Server direkt abfragen, / NSS / etc):

dig +short unix.stackexchange.com 

Wenn dig +short nicht verfügbar ist, ist eine beliebige verfügbar der folgenden sollte funktionieren. Alle diese fragen DNS direkt ab und ignorieren andere Auflösungsmittel:

host unix.stackexchange.com | awk "/has address/ { print $4 }" nslookup unix.stackexchange.com | awk "/^Address: / { print $2 }" dig unix.stackexchange.com | awk "/^;; ANSWER SECTION:$/ { getline ; print $5 }" 

Wenn Sie nur eine IP drucken möchten, fügen Sie die Befehl zum Workflow von awk.

dig +short unix.stackexchange.com | awk "{ print ; exit }" getent hosts unix.stackexchange.com | awk "{ print $1 ; exit }" host unix.stackexchange.com | awk "/has address/ { print $4 ; exit }" nslookup unix.stackexchange.com | awk "/^Address: / { print $2 ; exit }" dig unix.stackexchange.com | awk "/^;; ANSWER SECTION:$/ { getline ; print $5 ; exit }" 

Kommentare

  • Standardmäßig funktioniert dig nur mit ipv4, wobei der Host sowohl ipv4- als auch ipv6-Antworten gibt. Dies kann unerwartet sein. Sie können host www.google.com, dig +short www.google.com, host ipv6.google.com, dig +short ipv6.google.com, host www.facebook.com , dig +short www.facebook.com.
  • DIG funktioniert nicht. Wenn es sich um einen CNAME handelt, wird die IP nicht zurückgegeben.
  • Manchmal host kann eine Zeitüberschreitung aufweisen und gibt nichts zurück. Bei einigen Domänen gibt dig +short möglicherweise einen Domänenalias in der ersten Zeile zurück. Um sicherzustellen, dass es sich bei der Ausgabe um eine IPv4-Ausgabe handelt Adresse, verwenden Sie dig +short example.com | grep -Eo '[0-9\.]{7,15}' | head -1.
  • Die Verwendung von getent hosts <host> ist wie bei instan falsch ce es kann eine IPv6-Adresse geben, während IPv6 ‚ nicht funktioniert. Die richtige Lösung besteht darin, getent ahosts <host> zu verwenden, um bei Bedarf sowohl IPv6 als auch IPv4 zu testen.
  • Erwähnenswert: Host, Dig und nslookup scheinen direkt mit den aufgelisteten Servern zu kommunizieren in resolv.conf, während “ getent-Hosts “ sowohl die lokale Hosts-Datei als auch das Caching auf Bibliotheksebene (z. B. nscd) berücksichtigen, falls aktiviert .

Antwort

Mit host von der dnsutils -Paket:

$ host unix.stackexchange.com unix.stackexchange.com has address 64.34.119.12 

( Korrigiert Paketname gemäß den Kommentaren. Als Hinweis haben andere Distributionen host in verschiedenen Paketen: Debian / Ubuntu bind9-host , openSUSE bind-utils , Frugalware bind .)

Kommentare

  • Lesen Sie den nachstehenden Eintrag zum Auflösen, wenn Sie etwas auflösen müssen, das nicht in DNS enthalten ist (z. B. / etc / hosts).
  • Beachten Sie, dass host gibt manchmal eine mehrzeilige Ausgabe zurück (bei Weiterleitungen). ‚ möchte host unix.stackexchange.com | tail -n1 wenn Sie nur die Zeile mit der IP-Adresse möchten.
  • Es gibt mehrere Versionen von “ Host “ mit unterschiedlichen Ausgabeformaten. Z.B. Die meisten Systeme scheinen die BIND9-Version zu haben, aber mein Ubuntu 10.04 LTS-Server hat irgendwie eine völlig andere Version.
  • wenn Sie ‚ keine host oder dig installiert Sie können stattdessen Ping verwenden, das immer verfügbar ist: ping unix.stackexchange.com -c 1 -q 2>&1 | grep -Po "(\d{1,3}\.){3}\d{1,3}" Dies benötigt keine Zusätzliche Pakete werden auf den meisten Unix / Linux-Matchines installiert.
  • Diese Antwort verdient eine ernsthafte Ablehnung. host ist ein DNS-Tool (ähnlich wie nslookup), sodass nur Hosts in DNS nachgeschlagen werden, nicht z. /etc/hosts. Es ist also NICHT eine Antwort auf die Frage von OP ‚.

Antwort

Ich habe ein Tool auf meinem Computer, das die Aufgabe zu erledigen scheint. Die Manpage zeigt, dass es mit MySQL zu kommen scheint … So können Sie es verwenden:

resolveip -s unix.stackexchange.com 64.34.119.12 

Der Rückgabewert dieses Tools unterscheidet sich von 0 Wenn der Hostname nicht aufgelöst werden kann:

resolveip -s unix.stackexchange.coma resolveip: Unable to find hostid for "unix.stackexchange.coma": host not found exit 2 

UPDATE Auf Fedora wird ein MySQL-Server mitgeliefert:

yum provides "*/resolveip" mysql-server-5.5.10-2.fc15.x86_64 : The MySQL server and related files Dépôt : fedora Correspondance depuis : Nom de fichier : /usr/bin/resolveip 

Ich denke, es würde eine seltsame Abhängigkeit für Ihr Skript erzeugen …

Kommentare

  • Dies scheint hier die einzige Lösung zu sein, die den in Resolver integrierten ‚ des Betriebssystems verwendet – funktioniert also für / etc / hosts sowie DNS.
  • getent, wie in der anderen Antwort beschrieben, sieht sich auch / etc / hosts an und wird mit glibc geliefert hat keine Abhängigkeiten von einem Linux-System.
  • Ich würde nicht auflösen, da Sie eine Abhängigkeit von einem anderen Paket erstellen. getent ist standardmäßig installiert. Host, nslookup und dig sind alle in optionalen Paketen enthalten. Verwenden Sie auf jeden Fall getent in einem Skript.
  • Ich mag diese Antwort, aber ‚ gibt ipv6

Antwort

Mit dem folgenden Befehl mit dig können Sie das Ergebnis direkt lesen, ohne sed / awk / etc. Magie:

$ dig +short unix.stackexchange.com 64.34.119.12 

dig ist auch in dnsutils enthalten Paket.


Hinweis : dig hat den Rückgabewert 0, auch wenn der Name nicht aufgelöst werden konnte. Daher müssen Sie überprüfen, ob die Ausgabe leer ist, anstatt den Rückgabewert zu überprüfen:

hostname=unix.stackexchange.com ip=`dig +short $hostname` if [ -n "$ip" ]; then echo IP: $ip else echo Could not resolve hostname. fi 

Hinweis 2 : Wenn ein Hostname mehrere IP-Adressen hat (versuchen Sie beispielsweise debian.org), sind dies alle zurückgegeben. Dieses „Problem“ betrifft alle bisher in dieser Frage genannten Tools:

Kommentare

  • Beachten Sie, dass eine Domain einen CNAME-Eintrag hat Die Domain wird möglicherweise in der ersten Zeile anstelle einer IP-Adresse gedruckt.

Antwort

getent hosts unix.stackexchange.com | cut -d" " -f1 

Kommentare

  • Berücksichtigen Sie auch ahosts, ahostsv4, ahostsv6 mit getent.
  • cut ist nicht für getent ‚ s, die \t verwenden, um Spalten zu trennen. Dies ist unter Solaris der Fall.
  • @ceving: Auf Sola Möglicherweise müssen Sie cut ohne -d ausführen (standardmäßig \t als Trennzeichen). Unter Linux sind die Leerzeichen ‚, daher funktioniert die obige Zeile.

Antwort

Die bisher angegebenen Lösungen funktionieren meist im einfacheren Fall: Der Hostname wird direkt in eine einzelne IPv4-Adresse aufgelöst. Dies ist möglicherweise der einzige Fall, in dem Sie Hostnamen auflösen müssen. Wenn nicht, finden Sie im Folgenden eine Diskussion zu einigen Fällen, die Sie möglicherweise behandeln müssen.

Chris Down und Heinzi haben kurz den Fall besprochen, in dem der Hostname aufgelöst wird an mehr als eine IP-Adresse. In diesem Fall (und in anderen Fällen unten) kann die grundlegende Skripterstellung unter der Annahme, dass ein Hostname direkt in eine einzelne IP-Adresse aufgelöst wird, unterbrochen werden. Unten ein Beispiel mit einem Hostnamen, der in mehr als eine einzelne IP-Adresse aufgelöst wird:

$ host www.l.google.com www.l.google.com has address 209.85.148.147 www.l.google.com has address 209.85.148.103 www.l.google.com has address 209.85.148.99 www.l.google.com has address 209.85.148.106 www.l.google.com has address 209.85.148.105 www.l.google.com has address 209.85.148.104 

Aber was ist www.l.google.com ? Hier muss der Alias eingeführt werden. Schauen wir uns das folgende Beispiel an:

$ host www.google.com www.google.com is an alias for www.l.google.com. www.l.google.com has address 74.125.39.103 www.l.google.com has address 74.125.39.147 www.l.google.com has address 74.125.39.105 www.l.google.com has address 74.125.39.99 www.l.google.com has address 74.125.39.106 www.l.google.com has address 74.125.39.104 

www.google.com wird also nicht direkt in IP-Adressen aufgelöst, sondern in Ein Alias, der selbst in mehrere IP-Adressen aufgelöst wird. Weitere Informationen zu Aliasen finden Sie unter hier . Natürlich ist der Fall möglich, in dem ein Alias eine einzige IP-Adresse hat , wie unten gezeigt:

$ host g.www.ms.akadns.net g.www.ms.akadns.net is an alias for lb1.www.ms.akadns.net. lb1.www.ms.akadns.net has address 207.46.19.190 

Aber können Aliase verkettet werden?Die Antwort lautet ja:

$ host www.microsoft.com www.microsoft.com is an alias for toggle.www.ms.akadns.net. toggle.www.ms.akadns.net is an alias for g.www.ms.akadns.net. g.www.ms.akadns.net is an alias for lb1.www.ms.akadns.net. lb1.www.ms.akadns.net has address 207.46.19.254 $ host www.google.fr www.google.fr is an alias for www.google.com. www.google.com is an alias for www.l.google.com. www.l.google.com has address 74.125.39.147 www.l.google.com has address 74.125.39.103 www.l.google.com has address 74.125.39.99 www.l.google.com has address 74.125.39.106 www.l.google.com has address 74.125.39.104 www.l.google.com has address 74.125.39.105 

Ich habe kein Beispiel gefunden, in dem ein Hostname in einen Alias aufgelöst wird, der nicht in eine IP-Adresse aufgelöst wird, aber ich denke, die Es kann vorkommen, dass ein Fall auftritt.

Gibt es mehr als mehrere IP-Adressen und Aliase, gibt es noch andere Sonderfälle … was ist mit IPv6? Sie können Folgendes versuchen:

$ host ipv6.google.com ipv6.google.com is an alias for ipv6.l.google.com. ipv6.l.google.com has IPv6 address 2a00:1450:8007::68 

Dabei ist der Hostname ipv6.google.com ein Nur-IPv6-Hostname. Was ist mit Dual-Stack-Hostnamen:

$ host www.facebook.com www.facebook.com has address 66.220.153.15 www.facebook.com has IPv6 address 2620:0:1c08:4000:face:b00c:: 

Nochmals zu IPv6: Wenn Ihr Host nur IPv4 ist, können Sie weiterhin IPv6-Adressen auflösen (getestet nur unter IPv4 WinXP) und mit ipv6.google.com können Sie es unter Linux versuchen. In diesem Fall ist die Auflösung erfolgreich, aber ein Ping schlägt mit einer unbekannten Host-Fehlermeldung fehl. Dies kann ein Fall sein, in dem Ihre Skripterstellung fehlschlägt.

Ich hoffe, diese Bemerkungen waren nützlich.

Kommentare

  • Was für eine großartige Ergänzen Sie die akzeptierte Antwort und zeigen Sie alle Randfälle an, mit denen Sie sich bei der Skripterstellung befassen möchten. Meine Version host gibt nicht einmal an, dass “ die Adresse “ für meine Boxen hat.

Antwort

Um das Problem mit Aliasen zu vermeiden und immer eine einzige IP-Adresse zur Verwendung bereit zu halten:

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

Kommentare

Antwort

ping -q -c 1 -t 1 your_host_here | grep PING | sed -e "s/).*//" | sed -e "s/.*(//" 

funktioniert ohne Abhängigkeiten von anderen Systemen (und für in / etc / hosts angegebene Hosts)

Kommentare

  • Die Verwendung von Ping ist das, was ich brauchte, da ich den Wert aus der Hosts-Datei benötige, aber das sed-Muster korrekt analysiert, aber dies funktionierte Ping – q -c 1 -t 1 your_host_here | grep PING | sed -e “ s / ^ [^ (] * [(] // “ | sed -e “ s / [)]. * $ // “
  • Um etwas in meinem Heimnetzwerk wie myhostname.local aufzulösen, funktioniert dies so Für mich ist dies die beste Antwort.
  • Darf ich dies auch vorschlagen: ping -q -c 1 -t 1 bahface.local | grep -m 1 PING | cut -d "(" -f2 | cut -d ")" -f1
  • getent <ahosts|ahostsv4|ahostsv6|hosts> <hostname> funktioniert auch für Deklarationen innerhalb von /etc/hosts … und ‚ ist das Go-to-Tool für alle Arten von Systemdatenbanken (Passwd, Gruppe, Aliase, Dienste).

Antwort

Einfach, aber nützlich :

  1. getent ahostsv4 www.google.de | grep STREAM | head -n 1 | cut -d " " -f 1
  2. getent ahostsv6 www.google.de | grep STREAM | head -n 1 | cut -d " " -f 1
  3. getent hosts google.de | head -n 1 | cut -d " " -f 1

Alle Befehle lösen eine IP-Adresse auf, wenn der Host noch vorhanden ist. Wenn der Host auf einen CNAME zeigt, erhält er auch die IP darin case.

Der erste Befehl gibt die aufgelöste IPv4-Adresse zurück.

Der zweite Befehl gibt die res zurück alte IPv6-Adresse.

Der dritte Befehl gibt die bevorzugte Adresse des Besitzers zurück, die entweder eine IPv4- oder eine IPv6-Adresse sein kann.

Kommentare

  • Mit Abstand die einfachste. Und es ist standardmäßig verfügbar. Nicht wie host, für die die Installation der bindutils

Antwort

Hier ist eine geringfügige Variation des ping -Ansatzes, bei dem „unbekannter Host“ berücksichtigt wird (durch Weiterleiten durch stderr) und tr, um die Verwendung von sed regulären Ausdrücken zu vermeiden:

ping -c1 -t1 -W0 www.example.com 2>&1 | tr -d "():" | awk "/^PING/{print $3}" 

Falls Es ist wichtig, den Exit-Wert zu erfassen, dann funktioniert Folgendes (obwohl weniger elegant):

ping -c1 -t1 -W0 www.example.com &>/dev/null && ping -c1 -t1 -W0 www.example.com 2>&1 | tr -d "():" | awk "/^PING/{print $3}" 

Kommentare

  • Ich liebe diese Lösung, weil sie ohne zusätzliche Tools funktioniert.

Antwort

Um die Antwort von Chris Down zu vervollständigen und jfgagne-Kommentare zu (möglicherweise verketteten) Aliasen zu adressieren, gibt es eine Lösung, die:

  • mehrere IPs berücksichtigt
  • berücksichtigt Ein oder mehrere Aliase (CNAME)
  • fragen nicht die Datei /etc/hosts ab ( in meinem Fall wollte ich es nicht); Um es abzufragen, ist die Python-Lösung von dbernt perfekt.
  • verwendet nicht awk / sed

    dig +short www.alias.com | grep -v "\.$" | head -n 1 

Gibt immer die erste IP-Adresse oder eine leere Zeichenfolge zurück, wenn sie nicht aufgelöst wurde. Mit der Version von dig:

 $ dig -v DiG 9.8.1-P1 

Kommentare

  • Danke, andere Antworten setzen voraus, dass “ dig + short “ immer zurückkehrt eine einzelne IP-Adresse. Sie waren nicht ‚, die CNAMEs berücksichtigten.

Antwort

 php -r "echo gethostbyname("unix.stackexchange.com");" 

Kommentare

  • das funktioniert, aber es erfordert, dass PHP auf Ihrem Terminal installiert ist.
  • kann in einem typischen PHP-Docker-Container nützlich sein, in dem “ Host „, “ dig “ usw. sind nicht verfügbar

Antwort

Ich hätte dies gerne als Kommentar zu Andrew McGregor Re: ping hinzugefügt. Allerdings würde es mich nicht lassen, also muss ich dies als eine andere Antwort hinzufügen. (Wenn jemand es in einen Kommentar verschieben kann, zögern Sie nicht.)

Dies ist eine andere Variante, die nur Ping und Grep verwendet :

ping -q -c1 -t1 your_host_here | grep -Eo "([0-9]+\.?){4}" 

grep -E für erweiterten regulären Ausdruck und grep -o bis Geben Sie nur den passenden Teil zurück. Der reguläre Ausdruck selbst sucht viermal nach einer oder mehreren Ziffern ([0-9]+) und optional nach einem Punkt (\.?). {4})

Antwort

Sie können :

hostname=example.org # strips the IP IP=$( host ${hostname} | sed -e "s/.*\ //" ) # checks for errors if [ $? -ne 0 ] ; then echo "Error: cannot resolve ${hostname}" 1>&2 exit 1; fi 

Antwort

hier „ist ein Bash-Rezept Ich habe mit den Antworten anderer Leute gekocht – zuerst versucht /etc/hosts, dann greife ich auf nslookup zurück:

 resolveip(){ local host="$1" if [ -z "$host" ] then return 1 else local ip=$( getent hosts "$host" | awk "{print $1}" ) if [ -z "$ip" ] then ip=$( dig +short "$host" ) if [ -z "$ip" ] then echo "unable to resolve "$host"" >&2 return 1 else echo "$ip" return 0 fi else echo "$ip" return 0 fi fi }  

Kommentare

  • Um klar zu sein, getent hosts ist nicht ‚ ist nicht nur eine Suche in / etc / hosts – ‚ ist ein vollständiger DNS-Auflösungsaufruf an gethostbyaddr (3) und ‚ ist sehr unwahrscheinlich, wenn dig wird erfolgreich sein. Siehe die Manpage für getent .
  • @Stuart ist richtig – ich ‚ habe gelernt viel seit dem Schreiben und vereinfachte einen mächtigen Befehl. getent bleibt mein Favorit, obwohl ich auch dig +short

Antwort

nmap -sP 192.168.178.0/24|grep YOUR_HOSTNAME|sed -n "s/.*[(]\([0-9\.]*\)[)].*/\1/p" 

war die Lösung, die ich ohne DNS-Server gefunden habe

Antwort

Vielleicht nicht die prägnanteste, aber es scheint robust und effizient zu sein:

# $(get_host_dns_short "google.com") # # Outputs the IPv4 IP Address of a hostname, resolved by DNS. Returns 0 if DNS # responded successfully; 1 otherwise. Will mask error output. function get_host_dns_short() { ( set -o pipefail host -4 -W1 -t A "$1" 2>/dev/null | awk "/has address/ { print $NF; exit }" ) && return 0 || return 1 } 

Dies gibt eine einzelne IPv4 aus IP sowie Rückgabe von 1 im Fehlerfall, während die stderr-Ausgabe maskiert wird.

Sie können dies folgendermaßen verwenden:

GOOGLE_IP="$(get_host_dns_short "google.com")" if [[ $? -eq 0 ]]; then echo "Google"s IP is ${GOOGLE_IP}." else echo "Failed to resolve Google"s IP." fi 

Die IP von Google lautet 216.58.192.46.

Wenn Sie stattdessen eine IPv6-Adresse wünschen, ersetzen Sie einfach -4 durch -6.

Antwort

dig +noall +answer +nocomments example.com | awk "{printf "%-36s\t%s\n", $1, $5 }"

Kommentare

  • Ein gewisser Kontext, in dem sich diese Antwort gegenüber den bereits vorhandenen verbessert sei großartig. Bitte rücken Sie Befehle auch um 4 Leerzeichen ein (siehe Markdown-Syntax).

Antwort

dig ist ebenfalls langsam, nslookup ist viel schneller

nslookup google.com | grep -Po "Address:\s*[0-9.]+" | tail -1 | sed -e "s/Address:\s*//g" 

Antwort

1 Zeile löst eine Liste auf des Hostnamens

for LINE in `cat ~/Desktop/mylist`; do a=$(nslookup $LINE | awk "/^Address: / { print $1 }"); echo $a >> ~/Desktop/ip; done 

Antwort

Ich mache das die ganze Zeit auf meinem Mac ohne getent. ping scheint ein Hack zu sein. Ich möchte auch /etc/hosts berücksichtigen.

Also habe ich einen dummen Wrapper für dns.lookup für geschrieben Sie haben Node.js installiert, um eine CLI bereitzustellen:

$ npm install -g lookup-hostname $ lookup google.com 62.243.192.89 

Kommentare

  • 60% Chance von Bruch, bevor Sie sich einer Lösung nähern.
  • @dotbit könnten Sie näher darauf eingehen? Ich ‚ habe diese Woche seit ‚ 17 verwendet und hatte nie Probleme.
  • @Jensen, aber Sie ‚ ist wie immer der einzige, der jemals war. Der Rest von uns stößt normalerweise auf FAIL der einen oder anderen Art und immer.
  • “ wie immer “ Was meinst du damit? “ Der Rest von uns “ Wer ‚ ist das ? “ stößt auf FAIL “ Welches spezielle Problem sehen Sie? Ich ‚ bin neugierig.

Antwort

Ich ziehe an “ Ich kenne den einfachsten Weg für ein Bash-Skript nicht, aber wenn Sie einen Hostnamen auflösen und prüfen möchten, ob der Host aktiv ist, verwenden Sie ping!

ping -a hostname -c 1 

Wird ping den Host einmalig auflösen und den Hostnamen in IP-Adresse auflösen.

$ ping -a www.google.com -c 1 PING www.google.com (216.58.211.132) 56(84) bytes of data. 64 bytes from arn09s10-in-f4.1e100.net (216.58.211.132): icmp_seq=1 ttl=54 time=1.51 ms 

Kommentare

  • Ping zu verwenden ist gut, weil jeder es hat, aber Sie müssen Filtern Sie den IP-Teil aus den Ausgaben, wenn Sie ihn in einem Skript verwenden möchten.

Antwort

Ja, es gibt bereits viele Antworten, aber eine Lösung mit Perl fehlt:

perl -MSocket -MNet::hostent -E "say inet_ntoa((gethost shift)->addr)" unix.stackexchange.com 

In einem Bash-Skript könnte es folgendermaßen verwendet werden:

#!/bin/bash ipaddr=$(perl -MSocket -MNet::hostent -E "say inet_ntoa((gethost shift)->addr)" unix.stackexchange.com) echo $ipaddr 

Die hier verwendeten Module sind Kernmodule und sollten daher überall verfügbar sein, ohne mit CPAN installiert zu werden.

Kommentare

  • perl -MSocket -MNet::hostent -E 'say inet_ntoa((gethost shift)->addr)' unix.stackexchange.com 2>/dev/null ist viel sauberer. Aber niemand außer uns beiden verwendet p ö rl, alle anderen verwenden natürlich Pascal Script.
  • Eigentlich sehe ich die Fehlermeldungen lieber, wenn überhaupt geht schief. Can't call method "addr" on an undefined value ist nicht ‚ nicht genau die beste Fehlermeldung, kann aber einen Hinweis auf das Problem geben.

Antwort

#!/bin/bash systemd-resolve RT.com -t A | awk "{ print $4 ; exit }" systemd-resolve unix.stackexchange.com -t A --legend=no | awk "{ print $4 ; exit }" resolveip -s RT.com dig +short RT.com host RT.com | awk "/has address/ { print $4 }" nslookup RT.com | awk "/^Address: / { print $2 }" ping -q -c 1 -t 1 RT.com | grep PING | sed -e "s/).*//" | sed -e "s/.*(//" ruby -rresolv -e " print Resolv.getaddress "RT.com" " python2 -c "import socket; print socket.gethostbyname("RT.com")" perl -MSocket -MNet::hostent -E "say inet_ntoa((gethost shift)->addr)" RT.com 2>/dev/null php -r "echo gethostbyname( "RT.com" );" echo " all do work for me - take your pick! " 

Kommentare

  • Die Ruby-Version druckt Anführungszeichen um die IP-Adresse – wahrscheinlich sollte print anstelle von p verwendet werden.
  • Danke, @Slaven Rezic und zögern Sie nicht zu stimmen. Andererseits ist das Skript hier unten möglicherweise tatsächlich besser sichtbar … 😉

Antwort

host -t a cisco.com 

Dieser Befehl zeigt die IP-Adresse an (wird die Domain auf IP zurückgesetzt).

Antwort

Neben der obigen Lösung können Sie mehrere Hostnamen über das folgende Skript in IP übersetzen. Die einzige Abhängigkeit ist der Befehl „ping“ in Core Unix:

getip(){ ping -c 1 -t 1 $1 | head -1 | cut -d " " -f 3 | tr -d "()" 2>&1 | tee >> /tmp/result.log & } getip "hostname.number1.net" getip "hostname.number2.net" getip "hostname.number3.net" getip "hostname.number4.net" getip "hostname.number5.net" getip "hostname.number6.net" getip "hostname.number7.net" getip "hostname.number8.net" 
$ cat /tmp/result.log ABC.DEF.GHI.XY1 ABC.DEF.GHI.XY2 ABC.DEF.GHI.XY3 ABC.DEF.GHI.XY4 ABC.DEF.GHI.XY5 ABC.DEF.GHI.XY6 ABC.DEF.GHI.XY7 ABC.DEF.GHI.XY8 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.