Gibt es ein Standard-Befehlszeilentool für die Hostnamensuche?

Gibt es ein Standard-Befehlszeilentool für die Hostnamensuche?

Ich befinde mich in der Shell und möchte zu einem Hostnamen die entsprechende(n) IP-Adresse(n) wissen.

Ich weiß, dass ich es mit Perl, PHP, Python oder einer Reihe anderer Skriptsprachen (wahrscheinlich sogar mit awk!) hinbekommen könnte, und das hier wird mein Workaround sein, aber ich bin überrascht, dass es dafür anscheinend kein Kommandozeilentool gibt, keinen einfachen Wrapper getaddrinfo().

Liege ich falsch? Gibt es eines? host, digund getentzählen Sie nicht, ich möchte etwas, das die libc verwendet und gemäß handelt /etc/nsswitch.conf, und etwas, das wahrscheinlich standardmäßig auf jedem (Linux-)System installiert ist.

Hierher verschoben vonhttps://stackoverflow.com/questions/20211326/gibt es ein Standard-Befehlszeilentool zum Ausführen eines Hostname-Lookup?

Antwort: Ich habe mich geirrt. getentEs wird nicht ausschließlich in gesucht /etc/hosts, sondern es wird tatsächlich eine richtige Suche durchgeführt.

Antwort1

Das herkömmliche Tool zum Suchen von Hostnamen ist nslookup von Bind, wird aber durch Dig ersetzt. Beide Tools sind DNS-spezifisch und verwenden kein NSswitch. GetEnt Hosts verwendet NSswitch, wird aber viel seltener verwendet.

Antwort2

getentist sicherlich das richtige Werkzeug für diese Aufgabe, aber es ist leider nicht überall verfügbar, unter anderem weil es nicht zwingend erforderlich ist, da es von POSIX nicht definiert wurde.

Andererseits arpist es, obwohl es nicht im Standard angegeben ist, sehr unwahrscheinlich, dass es auf keinem Server verfügbar ist, der Namensauflösung durchführt. Wie die arpfolgenden nsswitch.confEinstellungen verwenden nur libc, sind auf jedem Linux/Unix-System verfügbar und liefern eine Ausgabe, die zwischen den Implementierungen konsistent zu sein scheint. Das Parsen der Ausgabe würde die Aufgabe erledigen:

$ arp stackoverflow.com | sed -e 's/.*(//' -e 's/).*$//'
198.252.206.16

Hier ist eine Shell-Funktion, die diese Methode verwendet und ein Problem mit Linux arp vermeidet, das in einigen Sonderfällen zu einem anderen Ausgabeformat wechselt:

resolve()
{
  : ${1:?Usage: resolve name}
  (
    PATH=$PATH:/usr/sbin
    ao=$(arp $1)
    [ "$(echo "$ao"|grep HWaddress)" ] && ao=$(arp -a $1)
    echo "$ao" | sed -e 's/.*(//' -e 's/).*$//'
  )
}

verwandte Informationen