GNU/Linux >> LINUX-Kenntnisse >  >> Linux

IP des lokalen Hosts

Ihre Frage enthält einen grundlegenden Fehler. Erstens können Hosts (und werden es wahrscheinlich) mehr als eine Adresse (z. B. mehrere Schnittstellen) und sogar mehr als eine Adresse pro Schnittstelle haben. Dies ist ein noch größeres Problem bei IPv6, wo jeder global verbundene Host mindestens zwei ist Adressen.

Zweitens wird der "beste" Weg, dies von einer Shell aus zu tun, von System zu System unterschiedlich sein.

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

Sogar auf den kleinsten gemeinsamen Nenner gehen und ifconfig verwenden nicht konsistent sein, da sich das Ausgabeformat ändern kann. Verwenden Sie jedoch Folgendes, um Ihr Beispiel aufzuräumen:

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

Wenn Sie statt der Shell eine schickere Sprache wie Perl, Ruby, Java usw. verwenden, hat jede Sprache ihre eigene Art, diese Daten vom Kernel zu erhalten. Ich überlasse es Ihnen, dies zu finden.


Die Informationen können sich jederzeit ändern, also müssen sie vom Kernel abgerufen werden, sie können nicht in einer Datei gespeichert werden.

Es gibt keinen wirklich netten Weg, um diese Informationen zu erhalten. Ihre Analyse ist so gut wie jede andere, außer dass die Hartcodierung der zweiten Zeile falsch ist:Es gibt keine Garantie dafür, dass die Schnittstellen in einer bestimmten Reihenfolge aufgelistet werden. Es ist ziemlich üblich, dass ein Computer mehr als eine Schnittstelle hat:Sie haben möglicherweise mehrere Netzwerkkarten oder virtuelle Schnittstellen.

Häufig ist die IP-Adresse, an der Sie interessiert sind, diejenige, die der Standardroute zugeordnet ist. Bei den meisten Konfigurationen erhalten Sie mit route die passende Schnittstelle Befehl, extrahieren Sie dann die IP-Adresse dieser Schnittstelle mit 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 sudo nicht aufgerufen werden muss . ifconfig und route sind oft nicht in der Voreinstellung PATH für Nicht-Root-Benutzer, aber Sie können sie ohne besondere Rechte verwenden, solange Sie nur Informationen lesen und die Einstellungen nicht ändern.

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

Unter Linux statt ifconfig und route , können Sie den ip verwenden Befehl aus der iproute2-Toolsuite. Während die Autoren von iproute2 ifconfig berücksichtigen und route zu verwerfen, gibt es tatsächlich wenig Vorteile bei der Verwendung von ip , seit der Ausgabe von ip ist nicht wesentlich einfacher zu parsen und ifconfig und route sind immer verfügbar, während einige abgespeckte Linux-Installationen ip weglassen .


Alle Antworten hier sind technisch korrekt, aber sie sind nicht das, was ich als "richtige" Antwort betrachten würde. Leider ist Ihre Frage sehr vage (was ich verstehen kann, wenn Sie nicht wirklich gut mit der Funktionsweise von Netzwerken unter Linux umgehen können), daher gebe ich einige Antworten auf mögliche Interpretationen der Frage.


Die primäre IP der Maschine

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

Die primäre IP ist einfach die IP, die dem Hostnamen der Maschine zugeordnet ist. Sie können diese IP finden, indem Sie Folgendes ausführen

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

Nun sucht dies die IP für den Hostnamen der Maschine gemäß /etc/nsswitch.conf . In den meisten Fällen ist die /etc/nsswitch.conf Datei enthält hosts: files dns . Das bedeutet, dass beim Versuch, Hostnamen oder Adressen nachzuschlagen, in /etc/hosts gesucht wird zuerst und konsultieren Sie dann DNS (wie von /etc/resolv.conf konfiguriert). ).
Also der Befehl getent hosts "$(hostname)" wird wahrscheinlich den passenden Eintrag von /etc/hosts abrufen . Der awk schnappt sich einfach nur die IP aus dieser Zeile.

(getent ist nur ein einfaches Dienstprogramm zum Abfragen von 'Datenbanken', die in /etc/nsswitch.conf aufgelistet sind )


Die IP, die zur Kommunikation mit der Außenwelt verwendet wird

Wie ich bereits erwähnt habe, ist die primäre IP der Maschine ziemlich bedeutungslos. Das Gerät kann eine von mehreren IPs für die Kommunikation verwenden. In Ihrem Fall haben Sie wahrscheinlich nur eine Schnittstelle und eine (nicht lokale Host-) 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 auf die Besonderheiten der Funktionsweise der Routing-Tabelle eingehen, da sie nicht einfach ist (es gibt mehrere Routing-Tabellen, und welche verwendet wird, hängt von den Tabellenauswahlregeln ab). Ich werde Ihnen nur sagen, wie Sie herausfinden, welche IP verwendet werden würde.

Um herauszufinden, welche IP für die Kommunikation mit einem bestimmten Ziel verwendet wird, verwenden Sie den folgenden Befehl:

ip route get 1.2.3.4

(mit 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 

Was mir das sagt ist, dass die IP 192.168.0.24 wird immer dann verwendet, wenn mein Rechner mit 74.125.139.102 spricht .

Wenn Sie nur die IP wollen, können Sie einfach einen zusätzlichen grep werfen am Ende.

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

grep wird anstelle eines awk verwendet weil es weniger fehleranfällig ist. Es ist möglich, dass sich die Zeile ändert, in der die IP nicht an derselben Stelle steht, aber sie folgt immer auf „src“, also holen wir uns einfach den Wert direkt nach „src“


Standard-Gateway-IP

Schließlich gibt es das Standard-Gateway. Wenn Sie kein bestimmtes Ziel zum Abfragen haben, um zu sehen, welche IP verwendet wird, können Sie das vom Standard-Gateway auswählen. Wenn Sie nur eine Schnittstelle haben, ist dies sowieso alles, was zählt.
Das ist im Grunde genau dasselbe wie oben, nur dass wir das Standard-Gateway als Ziel für die Suche 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 value ist die IP, die für den Datenverkehr verwendet wird, der durch das Standard-Gateway fließt.

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

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

Linux
  1. Ubuntu One-Verschlüsselung??

  2. Prozesshandle in lldbinit

  3. Was passiert, wenn mv unterbrochen wird?

  4. So deaktivieren Sie eine CPU

  5. Schwanz- und Platzhalterzeichen

Was ist 127.0.0.1 Localhost?

[Bash-Tipps] How To cd und ls in einem Befehl

[Bash-Tipps] Wie cp oder mv und cd in einem Befehl ausgeführt werden

Was ist Localhost?

Einheitspanel?

LibraryUnload schlägt fehl