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 aufsomehost
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 dieahosts
anstelle vonhosts
. - @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 gibtdig +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 Siedig +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öchtehost 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
oderdig
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 wienslookup
), 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
mitgetent
. -
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
- Ich habe eine Bash-Funktion erstellt, um aus dieser Antwort in meinem Bashrc zu bleiben: gist.github.com/brycepg/ba117a37de53906dc8fcc312bd7d5fee
-
python3 -c 'import socket; print(socket.gethostbyname("www.example.com"))'
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 :
-
getent ahostsv4 www.google.de | grep STREAM | head -n 1 | cut -d " " -f 1
-
getent ahostsv6 www.google.de | grep STREAM | head -n 1 | cut -d " " -f 1
-
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 derbindutils
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
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.
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.
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
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}
)
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
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, wenndig
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 auchdig +short
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 vonp
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