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+'