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

416

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

Eugene Yarmash
quelle
21
Schade, dass die getent <ahosts|ahostsv4|ahostsv6|hosts> <hostname>Antwort irgendwo unten in der Nähe des Bodens ist. Es ist das einfachste, erfordert keine zusätzlichen Pakete und ist auch einfacher aus einem Bash-Skript zu analysieren.
0xC0000022L
1
0xC0000022L @: Die neue Schande ist , dass diese Antwort schon sagt getent hosts somehost, wenn diese ausgeführt wird, während aufsomehost wird eine IPv6 - Adresse erzeugen , die aus verschiedenen ist , wie die meisten anderen Werkzeuge ( ping, sshzumindest) Namen aufzulösen, und einige Dinge bricht. Verwenden Sie ahostsstatt hosts.
j_random_hacker
@j_random_hacker: Wer hindert Sie daran, bestimmte IPv4- ( ahostsv4) oder IPv6- ( ahostsv6) Adressen anzufordern ? Persönlich finde ich nichts Falsches an der unspezifischen Anforderung, IPv6 zurückzugeben. Ihr Code sollte vorbereitet sein. IPv6 gibt es seit mehr als 20 Jahren.
0xC0000022L
@ 0xC0000022L: Niemand "hält mich" davon ab, aber die Antwort deutet ausdrücklich darauf hin hosts, und bisher haben 4 Personen den Kommentar von vinc17, in dem der durch "Plötzlich IPv6" verursachte Schmerz zum Ausdruck gebracht wird, positiv bewertet. Die Vorbereitung auf IPv6 ist nicht immer das Problem: Viele Programme müssen feststellen, 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 "wahre" Antwort zu finden. Letzteres ist ein Minenfeld, und so viele Programme und Systeme von Drittanbietern - über die ich keine Kontrolle habe - verwenden das erstere.
j_random_hacker

Antworten:

533

Sie können verwenden getent, was mit kommt glibc(so haben Sie es mit ziemlicher Sicherheit unter Linux). Dies löst die Verwendung von gethostbyaddr / gethostbyname2 auf 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 digdas +shortArgument verwenden (DNS-Server werden direkt /etc/hostsabgefragt, / NSS / etc wird nicht angezeigt):

dig +short unix.stackexchange.com

Wenn dig +shortnicht verfügbar, sollte eine der folgenden Möglichkeiten funktionieren. Alle diese fragen DNS direkt ab und ignorieren andere Lösungsmöglichkeiten:

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 den exitBefehl zum awkWorkflow hinzu.

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 }'
Chris Down
quelle
2
Standardmäßig funktioniert die Verwendung von dig nur mit IPv4, wobei der Host sowohl IPv4- als auch IPv6-Antworten gibt. Dies kann unerwartet sein. Sie können versuchen 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.
jfg956
6
DIG funktioniert nicht, wenn es sich um einen CNAME handelt, wird die IP nicht zurückgegeben.
Sorin
4
Manchmal hostkann eine Zeitüberschreitung auftreten und es wird nichts zurückgegeben. Bei einigen Domänen wird dig +shortmöglicherweise ein Domänenalias in der ersten Zeile zurückgegeben. Verwenden Sie also, um sicherzustellen, dass die Ausgabe eine IPv4-Adresse ist dig +short example.com | grep -Eo '[0-9\.]{7,15}' | head -1.
Caiguanhao
9
Die Verwendung getent hosts <host>ist falsch, da beispielsweise eine IPv6-Adresse vergeben werden kann, während IPv6 nicht funktioniert. Die richtige Lösung besteht darin, bei Bedarf getent ahosts <host>sowohl IPv6 als auch IPv4 zu testen.
Vinc17
5
Erwähnenswert: host, dig und nslookup scheinen direkt mit den in resolv.conf aufgelisteten Servern zu kommunizieren, wohingegen "getent hosts" sowohl die lokale Hostdatei als auch die Zwischenspeicherung auf Bibliotheksebene (wie z. B. nscd) berücksichtigen, falls aktiviert.
Saustrup
141

Mit hostaus dem dnsutils- Paket:

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

(Der Name des Pakets wurde gemäß den Kommentaren korrigiert . Als Hinweis haben andere Distributionen hostin verschiedenen Paketen: Debian / Ubuntu bind9-host , openSUSE bind-utils , Frugalware bind .)

Mann bei der Arbeit
quelle
4
Meinten Sie dnsutils ? Wie auch immer, hat gut hostfunktioniert, danke
Eugene Yarmash
Du hast wahrscheinlich Recht. Ich habe hier keinen Bogen, den ich überprüfen könnte. (Wollte später einen Kommentar anfügen, in dem dies erwähnt wird, aber die Antwort wurde bereits positiv bewertet, also nahm ich an, ich hätte es genagelt ...)
manatwork
1
Sehen Sie sich den Eintrag "resolveip" unten an, wenn Sie etwas auflösen müssen, das sich nicht im DNS befindet (z. B. / etc / hosts)
Gavin Brock
2
Beachten Sie, dass hostmanchmal mehrzeilige Ausgaben zurückgegeben werden (im Fall von Weiterleitungen), host unix.stackexchange.com | tail -n1wenn Sie nur die Zeile mit der IP-Adresse benötigen.
Edward Coffey
3
Diese Antwort verdient eine ernsthafte Ablehnung. hostist ein (ähnliches nslookup) DNS-Tool , mit dem nur Hosts im DNS gesucht werden, nicht z /etc/hosts. Es ist also KEINE Antwort auf die Frage von OP.
peterh
54

Ich habe ein Werkzeug auf meiner Maschine, das den Job zu erledigen scheint. Die Manpage zeigt, dass es mit MySQL zu kommen scheint ... Hier ist, wie Sie es verwenden könnten:

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 kommt es mit MySQL-Server:

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 schaffen ...

greg0ire
quelle
6
Dies scheint die einzige Lösung zu sein, die den eingebauten Resolver des Betriebssystems verwendet - funktioniert also sowohl für / etc / hosts als auch für DNS.
Gavin Brock
8
getentWie in der anderen Antwort ausführlich beschrieben, wird auch / etc / hosts betrachtet und mit glibc geliefert, sodass keine Abhängigkeiten von einem Linux-System bestehen.
Asfand Qazi
44

Mit dem folgenden Befehl digkönnen Sie das Ergebnis direkt ohne sed / awk / etc lesen. Magie:

$ dig +short unix.stackexchange.com
64.34.119.12

digist ebenfalls im dnsutilsPaket enthalten.


Hinweis : dighat einen Rückgabewert von 0, auch wenn der Name nicht aufgelöst werden konnte. Sie müssen also ü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 es debian.orgzum Beispiel), werden alle zurückgegeben. Dieses "Problem" betrifft alle Tools, die bisher in dieser Frage erwähnt wurden:

Heinzi
quelle
2
Beachten Sie, dass bei einer Domain mit einem CNAME-Eintrag die Domain möglicherweise in der ersten Zeile anstelle einer IP-Adresse gedruckt wird.
pcworld
40
getent hosts unix.stackexchange.com | cut -d' ' -f1
sborsky
quelle
4
Beachten Sie ahostsauch ahostsv4, ahostsv6mit getent.
0xC0000022L
cutWird nicht für getent's verwendet \t, um Spalten zu trennen. Dies ist unter Solaris der Fall.
18.
1
@ceving: Unter Solaris müssen Sie möglicherweise cutohne ausführen -d(standardmäßig \tals Begrenzer). Unter Linux sind es Leerzeichen, daher funktioniert die obige Zeile.
sborsky
27

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 dies nicht der Fall ist, finden Sie im Folgenden eine Erläuterung einiger Fälle, die Sie möglicherweise behandeln müssen.

Chris Down und Heinzi diskutierten kurz den Fall, in dem der Hostname in mehr als eine IP-Adresse aufgelöst wird. In diesem Fall (und in den folgenden Fällen) kann die grundlegende Skripterstellung unter der Annahme, dass ein Hostname direkt in eine einzelne IP-Adresse aufgelöst wird, zum Erliegen kommen. 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

Wird www.google.comalso nicht direkt in IP-Adressen aufgelöst, sondern in einen Alias, der sich in mehrere IP-Adressen auflöst. Weitere Informationen zu Aliasnamen finden Sie hier . Natürlich ist der Fall möglich, in dem ein Alias ​​eine einzelne 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 angekettet werden? Die Antwort ist 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, bei dem ein Hostname in einen Aliasnamen aufgelöst wird, der nicht in eine IP-Adresse aufgelöst wird, aber ich denke, der Fall könnte eintreten.

Gibt es neben mehreren IP-Adressen und Aliasnamen noch einige andere Sonderfälle? Was ist mit IPv6? Du könntest es 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

Wobei der Hostname ipv6.google.comein IPv6-Hostname ist. 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::

Auch bei IPv6 können Sie IPv6-Adressen auflösen, wenn Ihr Host nur IPv4 ist (getestet unter WinXP nur IPv4 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 Hostfehlermeldung fehl . Dies kann ein Fall sein, in dem Ihre Skripterstellung fehlschlägt.

Ich hoffe, diese Bemerkungen waren nützlich.

jfg956
quelle
2
Was für eine großartige Ergänzung zu der akzeptierten Antwort, die alle Randfälle zeigt, mit denen man sich in Skripten möglicherweise befassen möchte. Meine Version hostgibt nicht einmal "hat Adresse" für meine Boxen an.
Mihai Danila
21

So vermeiden Sie das Problem mit Aliasnamen und halten immer eine einzelne IP-Adresse bereit:

python -c 'import socket; print socket.gethostbyname("www.example.com")'
dbernt
quelle
Ich habe aus dieser Antwort eine Bash-Funktion gemacht, um meinen Bash-Code einzuhalten: gist.github.com/brycepg/ba117a37de53906dc8fcc312bd7d5fee
Bryce Guinta
18
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 Hosts, die in / etc / hosts angegeben sind)

Andrew McGregor
quelle
2
Die Verwendung von Ping ist das, was ich brauche, da ich den Wert aus der Hosts-Datei brauche, aber das Sed-Pattern-Parsing korrekt ist, aber das hat funktioniert: ping -q -c 1 -t 1 your_host_here | grep PING | sed -e "s / ^ [^ (] * [(] //" | sed -e "s /[)‹.*$//"
ManiacZX
1
Um etwas in meinem Heimnetzwerk wie myhostname.local aufzulösen, funktioniert dies. Für mich ist dies die beste Antwort.
Matt Friedman
1
Darf ich dies auch vorschlagen:ping -q -c 1 -t 1 bahface.local | grep -m 1 PING | cut -d "(" -f2 | cut -d ")" -f1
Matt Friedman
getent <ahosts|ahostsv4|ahostsv6|hosts> <hostname>Funktioniert auch für Deklarationen im Inneren /etc/hosts... und ist das Go-to-Tool für alle Arten von Systemdatenbanken (passwd, group, aliases, services).
0xC0000022L
17

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 CNAME zeigt, erhält er in diesem Fall auch die IP.

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

Der zweite Befehl gibt die aufgelöste IPv6-Adresse zurück

Der dritte Befehl gibt die bevorzugte IPv4- oder IPv6-Adresse des Besitzers zurück.

Tom Freudenberg
quelle
Mit Abstand die einfachste. Und es ist standardmäßig verfügbar. Nicht so hosterfordern die Installation derbindutils
Michaelbn
7

Hier ist eine kleine Variation des pingAnsatzes, der "unbekannten Host" berücksichtigt (durch Weiterleiten durch stderr) und verwendet tr, um die Verwendung von sedregulären Ausdrücken zu vermeiden :

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

Wenn es wichtig ist, den Exit-Wert zu erfassen, funktioniert Folgendes (wenn auch 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}'
Stefan Farestam
quelle
Ich liebe diese Lösung, weil sie ohne zusätzliche Werkzeuge funktioniert.
Radon8472
7

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

  • berücksichtigt mehrere IPs
  • berücksichtigt einen oder mehrere Aliase (CNAME)
  • fragt keine /etc/hostsDatei ab (in meinem Fall wollte ich es nicht); um es abzufragen, ist die Python-Lösung von dbernt perfekt)
  • benutzt awk / sed nicht

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

Gibt immer die erste IP-Adresse oder einen leeren String zurück, wenn dieser nicht aufgelöst wird. mit Version von dig:

    $ dig -v
    DiG 9.8.1-P1
Franck
quelle
1
Vielen Dank, andere Antworten gehen davon aus, dass "dig + short" immer eine einzelne IP-Adresse zurückgibt. CNAMEs wurden nicht berücksichtigt.
Jamshid
5
 php -r "echo gethostbyname('unix.stackexchange.com');"
Mohammed Zourob
quelle
Dies funktioniert, aber es erfordert, dass PHP auf Ihrem Terminal installiert ist
Radon8472
1
kann auf einem typischen PHP-Docker-Container nützlich sein, wo "Host", "Dig" usw. nicht verfügbar sind
Fabian Schmengler
5

Ich hätte dies gerne als Kommentar zu Andrew McGregor Re: ping hinzugefügt. Allerdings ließ es mich nicht, 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 -Efür erweiterte reguläre Ausdrücke und grep -oum nur den passenden Teil zurückzugeben. Der reguläre Ausdruck sucht nach einer oder mehreren Ziffern ( [0-9]+) und optional nach einem Punkt ( \.?) viermal ( {4}).

Dweia
quelle
4

Sie könnten verwenden host:

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
Matteo
quelle
4

Hier ist ein Bash-Rezept, das ich mir mit den Antworten anderer Leute ausgedacht habe - zuerst versucht /etc/hosts, dann greift 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
}
RubyTuesdayDONO
quelle
Um es klar auszudrücken , es getent hostshandelt sich nicht nur um eine Suche in / etc / hosts - es handelt sich um einen vollständigen DNS-auflösenden Aufruf von gethostbyaddr (3) , und es ist sehr unwahrscheinlich, dass er fehlschlägt, wenn dies diggelingt. Siehe die Manpage für getent .
Stuart P. Bentley
@Stuart hat recht - seit ich das geschrieben habe, habe ich viel gelernt und einen mächtigen Befehl stark vereinfacht. getentbleibt mein Favorit, obwohl ich auch magdig +short
RubyTuesdayDONO
4
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

Philippe Gachoud
quelle
3

Vielleicht nicht die prägnanteste, aber sie 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-IP aus und kehrt 1im Fehlerfall zurück, während die stderr-Ausgabe maskiert wird.

Du kannst es so benutzen:

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 diese -4durch -6.

Wille
quelle
3

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

DP Baker
quelle
1
Ein gewisser Zusammenhang, inwiefern sich diese Antwort gegenüber den bereits vorhandenen verbessert, wäre großartig. Bitte rücken Sie die Befehle auch um 4 Leerzeichen ein (siehe Markdown-Syntax).
Maxschlepzig
2

1 Zeile löst eine Liste von Hostnamen auf

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

Ich mache das die ganze Zeit auf meinem Mac, der nicht hat getent. pingscheint wie ein Hack. Das möchte ich auch /etc/hostsberücksichtigen.

Deshalb habe ich einen dummen Wrapper für dns.lookupSie geschrieben, auf dem Node.js installiert ist, um eine CLI bereitzustellen:

$ npm install -g lookup-hostname
$ lookup google.com
62.243.192.89
Thomas Jensen
quelle
60% Bruchwahrscheinlichkeit, bevor Sie sich einer Lösung nähern.
Dotbit
@dotbit könntest du das näher erläutern? Ich habe diese wöchentliche seit '17 verwendet und hatte nie irgendwelche Probleme.
Thomas Jensen
@ Jensen, aber du bist wie immer der Einzige. Der Rest von uns stößt normalerweise auf die eine oder andere Art und immer auf FAIL.
Dotbit
"wie immer" Was meinst du damit? "Der Rest von uns" Wer ist das? "run into FAIL" Welches spezifische Problem sehen Sie? Ich bin neugierig.
Thomas Jensen
2

dig ist zu langsam, nslookup ist viel schneller

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

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

ping -a hostname -c 1

Wird pingder Host einmal 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
user257655
quelle
Die Verwendung von Ping ist gut, weil es jeder hat, aber Sie müssen den IP-Part aus den Ausgaben herausfiltern, wenn Sie es in einem Skript verwenden möchten.
Radon8472
1

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 dies so aussehen:

#!/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.

Slaven Rezic
quelle
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 benutzt pörl, alle anderen benutzen natürlich Pascal Script.
Dotbit
Eigentlich ziehe ich es vor, die Fehlermeldungen zu sehen, wenn etwas schief geht. Can't call method "addr" on an undefined valueist nicht gerade die beste Fehlermeldung, kann aber einen Hinweis auf das Problem geben.
Slaven Rezic
1
#!/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!  "
Dotbit
quelle
1
Die Ruby-Version gibt Anführungszeichen um die IP-Adresse aus - printsollte wahrscheinlich anstelle von verwendet werden p.
Slaven Rezic
Vielen Dank, @Slaven Rezic und zögern Sie nicht zu stimmen. dann nochmal, hier unten ist das script vielleicht besser sichtbar ... ;-)
dotbit
-1
host -t a cisco.com

Dieser Befehl zeigt die IP-Adresse an (Domain wird auf IP umgestellt)

aaa
quelle
-1

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
Kevin Li
quelle