IP des lokalen Hosts

IP des lokalen Hosts

Wie bestimmt eine Linux-Instanz ihre IP-Adresse?

Das heißt, nicht die 127.0.0.1.

Wird dies in einer Datei gespeichert oder berechnet ifconfig es irgendwie bei jedem Aufruf?

Ich habe es geschafft, es zu lösen, nur um zu zeigen, dass ich mir Mühe gegeben habe, aber es ist nichts, was ich in eine ernsthafte Bewerbung einbringen würde:

sudo ifconfig | head -n 2 | tail -n 1 | tr -s " " | tr " " ":" | cut -d":" -f 4

Antwort1

Ihre Frage hat grundlegende Mängel. Erstens können (und werden) Hosts mehr als eine Adresse haben (z. B. mehrere Schnittstellen) und sogar mehr als eine Adresse pro Schnittstelle. Dies ist bei IPv6 noch problematischer, da jeder global verbundene Host mindestenszweiAdressen.

Zweitens ist die „beste“ Möglichkeit, dies von einer Shell aus zu tun, von System zu System unterschiedlich.

Linux:

/sbin/ip addr show eth0 | awk -F"[ /]+" '/inet / {print $3}'

>= Solaris 11:

ipadm show-addr net0/v4 | awk -F"[ /]+" '/ok/ {print $5}'

Mac OS X/Darwin:

ipconfig getifaddr en0

Selbst wenn Sie den kleinsten gemeinsamen Nenner verwenden, ifconfigist dies nicht konsistent, da sich das Ausgabeformat ändern kann. Um Ihr Beispiel zu bereinigen, verwenden Sie jedoch Folgendes:

ifconfig eth0 | awk -F"[ :]+" '/inet / {print $4}'

Wenn Sie statt der Shell eine anspruchsvollere Sprache wie Perl, Ruby, Java usw. verwenden, hat jede Sprache ihre eigene Methode, diese Daten vom Kernel abzurufen. Das herauszufinden, überlasse ich Ihnen.

Antwort2

Die Informationen können sich jederzeit ändern und müssen daher aus dem Kernel abgerufen werden. Sie können nicht in einer Datei gespeichert werden.

Es gibt keine wirklich gute Möglichkeit, diese Informationen zu erhalten. Ihre Analyse ist so gut wie jede andere, außer dass die Festcodierung der zweiten Zeile falsch ist: Es gibt keine Garantie, dass die Schnittstellen in einer bestimmten Reihenfolge aufgelistet werden. Es ist ziemlich üblich, dass ein Computer über mehr als eine Schnittstelle verfügt: Sie können mehrere Netzwerkkarten oder virtuelle Schnittstellen haben.

Häufig ist die IP-Adresse, die Sie interessiert, diejenige, die der Standardroute zugeordnet ist. Bei den meisten Konfigurationen können Sie die richtige Schnittstelle mit dem routeBefehl abrufen und dann die IP-Adresse dieser Schnittstelle mit extrahieren ifconfig.

/sbin/ifconfig $(/sbin/route -n |
                 awk '$1 == "0.0.0.0" {print $8}') |
awk 'match($0, /inet addr:[.0-9]+/) {print substr($0, RSTART+10, RLENGTH-10)}'

Beachten Sie, dass es nicht notwendig ist, aufzurufen sudo. ifconfigund routesind für Nicht-Root-Benutzer häufig nicht in der Standardeinstellung enthalten. PATHSie können sie jedoch ohne besondere Berechtigungen verwenden, solange Sie nur Informationen lesen und die Einstellungen nicht ändern.

Bei anderen Unix-Varianten als Linux müssen Sie die obigen Befehle möglicherweise anpassen. Die meisten haben Befehle namens ifconfigund route, aber das Ausgabeformat kann anders sein.

Unter Linux können Sie anstelle von ifconfigund den Befehl aus demrouteipiproute2Tool-Suite. Obwohl die Autoren von iproute2 ifconfigund routeals veraltet betrachten, bietet die Verwendung von tatsächlich wenig Vorteile ip, da die Ausgabe von ipnicht wesentlich einfacher zu analysieren ist und ifconfigund routeimmer verfügbar sind, während einige abgespeckte Linux-Installationen weglassen ip.

Antwort3

Alle Antworten hier sind technisch korrekt, aber sie sind nicht das, was ich als die „richtige“ Antwort bezeichnen würde. Leider ist Ihre Frage äußerst vage (was ich verstehen kann, wenn Sie sich nicht wirklich gut mit der Funktionsweise von Netzwerken unter Linux auskennen), daher werde ich einige Antworten auf mögliche Interpretationen der Frage geben.


Die primäre IP der Maschine

Die Maschine hat eine IP über allen anderen, die als primäre IP der Maschine gilt. Beachten Sie jedoch, dass dies ziemlich bedeutungslos ist, da eine Box mehrere IPs haben kann und es unterschiedlich ist, welche verwendet wird (darauf werde ich gleich eingehen).

Die primäre IP ist einfach die IP, die mit dem Hostnamen des Rechners verknüpft ist. Sie können diese IP finden, indem Sie den folgenden Befehl ausführen:

getent hosts "$(hostname)" | awk '{ print $1 }'

Dies sucht nun die IP für den Hostnamen des Computers gemäß /etc/nsswitch.conf. In den meisten Fällen /etc/nsswitch.confenthält die Datei hosts: files dns. Dies bedeutet, dass beim Versuch, Hostnamen oder Adressen nachzuschlagen, /etc/hostszuerst in gesucht und dann DNS (wie von konfiguriert) konsultiert wird /etc/resolv.conf.
Der Befehl getent hosts "$(hostname)"wird also wahrscheinlich den passenden Eintrag aus abrufen /etc/hosts. Der Befehl awkholt einfach nur die IP aus dieser Zeile.

( getentist nur ein einfaches Dienstprogramm zum Abfragen der in aufgeführten „Datenbanken“ /etc/nsswitch.conf)


Die zur Kommunikation mit der Außenwelt verwendete IP

Wie ich bereits erwähnt habe, ist die primäre IP des Computers ziemlich bedeutungslos. Der Computer kann mehrere IPs zur Kommunikation verwenden. In Ihrem Fall haben Sie wahrscheinlich nur eine Schnittstelle und eine (nicht lokale) IP. Ein Server kann jedoch mehrere Schnittstellen oder IPs haben (manchmal mehrere IPs auf einer einzigen Schnittstelle).
Welche IP verwendet wird, wird durch die Routing-Tabelle des Kernels bestimmt. Ich werde nicht näher darauf eingehen, wie die Routing-Tabelle funktioniert, da dies nicht einfach ist (es gibt mehrere Routing-Tabellen, und welche verwendet wird, hängt von den Tabellenauswahlregeln ab). Ich werde Ihnen nur erklären, wie Sie herausfinden, welche IP verwendet wird.

Um herauszufinden, welche IP zur Kommunikation mit einem bestimmten Ziel verwendet wird, verwenden Sie den folgenden Befehl:

ip route get 1.2.3.4

(wobei 1.2.3.4die IP des Ziels ist)

Wenn ich dies auf meinem Computer mit einer der IPs von google.com mache ( 74.125.139.102), erhalte ich Folgendes:

74.125.139.102 via 192.168.0.1 dev wlan0  src 192.168.0.24 
    cache 

Dies bedeutet für mich, dass die IP 192.168.0.24immer dann verwendet wird, wenn mein Computer mit kommuniziert 74.125.139.102.

Wenn Sie nur die IP möchten, können Sie einfach grepam Ende ein Extra anhängen.

ip route get 1.2.3.4 | grep -oP '(?<=src )\S+'

grepwird anstelle von verwendet, awkda es weniger fehleranfällig ist. Es ist möglich, dass sich die Zeile ändert, sodass die IP nicht mehr an derselben Stelle steht, aber sie folgt immer auf „src“, also greifen wir einfach auf den Wert direkt nach „src“ zu.


Standard-Gateway-IP

Zuletzt gibt es noch das Standard-Gateway. Wenn Sie kein bestimmtes Ziel haben, um abzufragen, welche IP verwendet wird, können Sie die vom Standard-Gateway auswählen. Wenn Sie nur eine Schnittstelle haben, ist das ohnehin alles, was zählt.
Dies ist im Prinzip genau dasselbe wie oben, nur dass wir als Ziel für die Suche das Standard-Gateway verwenden.

ip route get "$(ip route show to 0/0 | grep -oP '(?<=via )\S+')"

Dadurch erhalten Sie eine Zeile wie im obigen Abschnitt. Der srcWert ist die IP, die für den Datenverkehr über das Standard-Gateway verwendet wird.

Um nur die IP zu erhalten, fügen Sie wie im vorherigen Abschnitt ein grep. hinzu.

ip route get "$(ip route show to 0/0 | grep -oP '(?<=via )\S+')" | grep -oP '(?<=src )\S+'

Antwort4

Ihre Anfrage ist mehrdeutig. Normalerweise meinen die Leute mit dem Wort „localhost“ die Loopback-Schnittstelle und 127.0.0.1 ist die häufigste und richtige Antwort.

Was Ihnen fehlt ist:

  • Die Tatsache, dass jede Schnittstelle eine andere IP haben kann, zeigt, dass die Loopback-Schnittstelle eine Netzwerkschnittstelle ist, genau wie Ihre Ethernet-Karte oder Ihr drahtloser USB-Empfänger.
  • Ein einzelner PC hat daher nicht nur eine einzige IP. Es hängt alles davon ab, welche Schnittstelle Sie in Betracht ziehen und wie viele Schnittstellen Sie unter Ihrem Betriebssystem verwenden.

Sie interessieren sich wahrscheinlich für das Thema „Kernel-Routingtabellen“, das Ihnen einen guten Einstieg in die Handhabung Ihrer Netzwerkaktivitäten durch den Kernel bietet.

verwandte Informationen