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, ifconfig
ist 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 route
Befehl 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
. ifconfig
und route
sind für Nicht-Root-Benutzer häufig nicht in der Standardeinstellung enthalten. PATH
Sie 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 ifconfig
und route
, aber das Ausgabeformat kann anders sein.
Unter Linux können Sie anstelle von ifconfig
und den Befehl aus demroute
ip
iproute2Tool-Suite. Obwohl die Autoren von iproute2 ifconfig
und route
als veraltet betrachten, bietet die Verwendung von tatsächlich wenig Vorteile ip
, da die Ausgabe von ip
nicht wesentlich einfacher zu analysieren ist und ifconfig
und route
immer 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.conf
enthält die Datei hosts: files dns
. Dies bedeutet, dass beim Versuch, Hostnamen oder Adressen nachzuschlagen, /etc/hosts
zuerst 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 awk
holt einfach nur die IP aus dieser Zeile.
( getent
ist 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.4
die 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.24
immer dann verwendet wird, wenn mein Computer mit kommuniziert 74.125.139.102
.
Wenn Sie nur die IP möchten, können Sie einfach grep
am Ende ein Extra anhängen.
ip route get 1.2.3.4 | grep -oP '(?<=src )\S+'
grep
wird anstelle von verwendet, awk
da 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 src
Wert 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.