Ich suche nach einer Befehlszeilenlösung, die mir die primäre (erste) IP-Adresse des lokalen Hosts außer 127.0.0.1 zurückgibt
Die Lösung sollte mindestens für Linux (Debian und RedHat) und OS X 10.7+ funktionieren
Mir ist bekannt, dass dies ifconfig
auf beiden verfügbar ist, aber die Ausgabe zwischen diesen Plattformen ist nicht so konsistent.
curl -4 ifconfig.co
. Es wird mit Ihrer externen IP4-Adresse antworten.Antworten:
Verwenden Sie
grep
diese Option, um die IP-Adresse zu filtern vonifconfig
:ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'
Oder mit
sed
:ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'
Wenn Sie nur an bestimmten Schnittstellen interessiert sind, wlan0, eth0 usw., dann:
ifconfig wlan0 | ...
Sie können den Befehl in Ihrem Alias verwenden
.bashrc
, um einen eigenen Befehl zu erstellen, der beispielsweise aufgerufen wirdmyip
.alias myip="ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'"
Ein viel einfacherer Weg ist
hostname -I
(hostname -i
für ältere Versionen von,hostname
aber siehe Kommentare). Dies ist jedoch nur unter Linux möglich.quelle
-E
Option für Extended RE verwendet, nicht die-r
Option im GNU-Stil .-E
. Neuere Versionen von FreeBSD haben die-r
Option als Alias hinzugefügt-E
, um die Portabilität von Skripten zu vereinfachen. Das Update wurde jedoch noch nicht auf OSX übertragen. Zuletzt habe ich überprüft, dass immer noch eine Version von sed aus einer FreeBSD-Version von vor einigen Jahren verwendet wird. Ich bin mir nicht sicher, welcher genau, da OSX im Laufe der Jahre einige Male FreeBSD-Quellcode übernommen hat. Ich glaube , dass die Verwendung von-E
gedacht war vergleichbar zu seingrep
‚s --E
Option. Keine Ahnung, warum sich GNU-Leute-r
stattdessen dafür entschieden haben .-E
die Portabilität zu gewährleisten. Sie würden denken, dass dies--help
und dieman pages
Aktualisierung erfolgen würden. Es hat mich früher in einer anderen Frage mit-E
Das Folgende funktioniert unter Linux, aber nicht unter OSX.
Dies hängt überhaupt nicht von DNS ab und funktioniert auch dann, wenn
/etc/hosts
es nicht richtig eingestellt ist (1
Abkürzung für1.0.0.0
):oder Vermeiden
awk
und Verwenden des öffentlichen DNS von Google unter8.8.8.8
:Ein weniger zuverlässiger Weg: (siehe Kommentar unten)
quelle
hostname -I
ist unzuverlässig, da (laut Dokumentation) keine Annahmen über die Reihenfolge der Adressen getroffen werden können. Es kann sich also durchaus um ein internes Netzwerk handeln (wie das Netzwerk, in dem virtuelle Maschinen leben). Die andere Methode scheint gut zu sein.ip route get 1 | awk '{print $(NF-2);exit}'
funktioniert es, wenn ich an das Outptut angehängt werdeip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p'
Für Linux-Computer (nicht OS X):
quelle
hostname -i
ist die entsprechende Kurzformhostname
GNU Coreutils Version 8.26.hostname -i
gibt nur die lokale IP, währendhostname -I
alle anderen IPsunter Linux
unter macOS
hostname -I
mehrere Adressen in einer unzuverlässigen Ordnung zurückkehren kann (siehe diehostname
Man - Page ), aber für mich ist es gerade Rückkehr192.168.1.X
, das ist das, was Sie wollten.quelle
hostname -i
mit einem niedrigeren I.-i
Flagge sagt dies :Avoid using this option; use hostname -I instead
.Lösung
Erläuterung
Die richtige Methode zum Abfragen von Netzwerkinformationen ist
ip
:-o
einzeiliger Ausgangroute get to
Holen Sie sich die tatsächliche Kernel-Route zu einem Ziel8.8.8.8
Google IP, kann aber die echte IP verwenden, die Sie erreichen möchtenzB
ip
Ausgabe:Um die
src
IP zu extrahieren ,sed
ist die hellste und am besten mit der Regex-Unterstützung kompatibel:-n
Standardmäßig keine Ausgabe's/pattern/replacement/p'
Nur Muster und Druck ersetzen.*src \([0-9.]\+\).*
stimmen mit der vom Kernel verwendeten src-IP überein, um zu erreichen8.8.8.8
zB endgültige Ausgabe:
Andere Antwort
Ich denke, keine der vorhergehenden Antworten ist gut genug für mich, da sie in einer neueren Maschine nicht funktionieren (Gentoo 2018).
Probleme, die ich mit vorhergehenden Antworten gefunden habe:
ifconfig
veraltet ist und beispielsweise keine mehrfachen IPs auflistet;awk
für eine einfache Aufgabe, die sed besser bewältigen kann;ip route get 1
ist unklar und ist eigentlich ein Alias fürip route get to 1.0.0.0
hostname
Befehls, der nicht-I
in allen Appliances eine Option hat und127.0.0.1
in meinem Fall zurückgibt.quelle
Bearbeitet (
2014-06-012018-01-09)Für eine stärkere Konfiguration mit vielen Schnittstellen und vielen IP-Adressen, die auf jeder Schnittstelle konfiguriert sind, habe ich ein reines Bash- Skript (nicht basierend auf
127.0.0.1
) geschrieben, um die richtige Schnittstelle und IP basierend auf zu findendefault route
. Ich poste dieses Skript ganz unten in dieser Antwort.Intro
Wie beide Os haben Bash Standardmäßig installiert, gibt es einen Bash-Tipp für Mac und Linux:
Das Problem mit dem Gebietsschema wird durch Folgendes verhindert
LANG=C
:Dies in eine Funktion umsetzen:
Minimal:
Einfache Verwendung:
Lust auf Ordnung:
Verwendungszweck:
oder mit derselben Funktion, jedoch mit einem Argument:
Anmerkung: Ohne Argument wird diese Funktion auf STDOUT, der IP und einer Newline ausgegeben , mit einem Argument wird nichts gedruckt, aber eine als Argument bezeichnete Variable wird erstellt und enthält IP ohne Newline .
Nota2: Dies wurde auf Debian getestet, LaCie hackte nas und MaxOs. Wenn dies unter Ihrer Umgebung nicht funktioniert, bin ich sehr an Rückmeldungen interessiert!
Ältere Version dieser Antwort
(Nicht gelöscht, weil basierend auf
sed
, nichtbash
.)Warnung: Es gibt ein Problem mit Gebietsschemas!
Schnell und klein:
Explodiert (Arbeit auch;)
Bearbeiten:
Wie! Dies scheint unter Mac OS nicht zu funktionieren ...
Ok, dies scheint unter Mac OS genauso zu funktionieren wie unter Linux :
aufgeteilt:
Mein Drehbuch (Januar 2018):
Dieses Skript findet zuerst Ihre Standardroute und -schnittstelle , für die es verwendet wird, und sucht dann nach dem lokalen IP-passenden Netzwerk des Gateways und füllt Variablen. Die letzten beiden Zeilen werden nur gedruckt, so etwas wie:
oder
Nun, da ist es:
quelle
sbin
nicht auf meinem$PATH
vollständigen Pfad angegeben werden muss, aber der gleiche Pfad existiert auch unter MacOS .:-)time
um auszuwählen, welche Sie so lange verwenden würden ...Spezifisch nur für bestimmte Builds von Ubuntu. Obwohl es Ihnen vielleicht nur sagt
127.0.0.1
:oder
quelle
$ hostname --ip-address
gibt mir nur127.0.0.1
auf Arch LinuxSie können die IP-Adresse 4 von eth0 auch mit diesem Befehl unter Linux abrufen
Die Ausgabe wird so sein
quelle
Dies funktioniert unter Linux und OSX
Dadurch wird die der Standardroute zugeordnete Schnittstelle abgerufen
Rufen Sie über die oben beschriebene Schnittstelle die IP-Adresse ab.
OSX
Darwin Laptop 14.4.0 Darwin Kernel Version 14.4.0: Do 28. Mai 11:35:04 PDT 2015; root: xnu-2782.30.5 ~ 1 / RELEASE_X86_64 x86_64
en5
192.168.0.130
CentOS Linux
Linux dev-cil.medfx.local 2.6.18-164.el5xen 1 SMP Do 3. September 04:03:03 EDT 2009 x86_64 x86_64 x86_64 GNU / Linux
eth0
192.168.46.10
quelle
| head -1
am Ende der ersten Zeile, um die Standardschnittstelle zu erhalten, und der Rest ist gut.Verwenden einiger anderer Methoden Sie können einen Konflikt eingeben, bei dem mehrere IP-Adressen auf dem System definiert sind. Diese Zeile erhält standardmäßig immer die verwendete IP-Adresse.
quelle
Ich extrahiere meinen Kommentar zu dieser Antwort:
Es basiert auf der Antwort von @CollinAnderson, die in meinem Fall nicht funktioniert hat.
quelle
quelle
bash
Alias machenalias myip="ifconfig | grep 'inet ' | grep -v '127.0.0.1' | awk '{print \$2}'"
Der kürzeste Weg, um Ihre lokale IPv4-Adresse auf Ihrem Linux-System zu erhalten:
quelle
Angenommen, Sie benötigen Ihre primäre öffentliche IP-Adresse, wie sie vom Rest der Welt aus gesehen wird, versuchen Sie eine der folgenden Möglichkeiten:
quelle
Ich muss Collin Andersons Antwort hinzufügen, dass diese Methode auch berücksichtigt, wenn Sie zwei Schnittstellen haben und beide als oben angezeigt werden.
Ich habe an einer Anwendung mit Raspberry Pi's gearbeitet und brauchte die IP-Adresse, die tatsächlich verwendet wurde, nicht nur, ob sie aktiv war oder nicht. Die meisten anderen Antworten geben beide IP-Adressen zurück, was nicht unbedingt hilfreich ist - für mein Szenario jedenfalls.
quelle
IP der primären Netzwerkschnittstelle
quelle
Findet eine IP-Adresse dieses Computers in einem Netzwerk, das ein Standard-Gateway ist (z. B. schließt alle virtuellen Netzwerke, Docker-Bridges aus), z. Internet-Gateway, WLAN-Gateway, Ethernet
Funktioniert unter Linux.
Prüfung:
quelle
quelle
Eine weitere
ifconfig
Variante, die sowohl unter Linux als auch unter OSX funktioniert:quelle
ifconfig | grep '\<inet\>' | cut -d ' ' -f2 | grep -v '127.0.0.1'
Ich ging viele Links durch (StackExchange, AskUbuntu, StackOverflow usw.) und kam zu der Entscheidung, die besten Lösungen in einem Shell-Skript zu kombinieren.
Meiner Meinung nach sind diese beiden QAs die besten:
Wie kann ich meine externe IP-Adresse in einem Shell-Skript erhalten? https://unix.stackexchange.com/q/22615
Wie finde ich meine interne IP-Adresse? https://askubuntu.com/a/604691
Hier ist meine Lösung, die auf einigen Ideen von rsp basiert, die in seinem Repository ( https://github.com/rsp/scripts/) geteilt wurden. ) geteilt wurden.
Einige von Ihnen könnten sagen, dass dieses Skript für so einfache Aufgaben extrem umfangreich ist, aber ich möchte es so einfach und flexibel wie möglich gestalten. Es unterstützt einfache Konfigurationsdateien, mit denen die Standardwerte neu definiert werden können.
Es wurde erfolgreich unter Cygwin, MINGW und Linux (Red Hat) getestet.
Interne IP-Adresse anzeigen
Externe IP-Adresse anzeigen
Quellcode, auch über den Link verfügbar: https://github.com/ildar-shaimordanov/tea-set/blob/master/home/bin/myip . Ein Beispiel für eine Konfigurationsdatei befindet sich neben dem Hauptskript.
quelle
Ich verwende nur Netzwerkschnittstellennamen , mein benutzerdefinierter Befehl lautet
in meinem eigenen Notizbuch
Wenn die Netzwerkschnittstelle jedoch mindestens eine IP-Adresse besitzt, wird angezeigt, dass alle IP-Adressen dazu gehören
zum Beispiel
Ubuntu 16.10
Debian Jessie
CentOS 6.8
Fedora 24
Es scheint, dass
ip route get 1 | awk '{print $NF;exit}'
der von link bereitgestellte Befehl genauer ist, außerdem kürzer.quelle
Nicht sicher, ob dies in allen Betriebssystemen funktioniert, probieren Sie es aus.
quelle
ip route get 1 | awk '{print $NF;exit}'
. Sollte auf den meisten Systemen funktionieren.ip route get 1 | awk '{print $NF;exit}'
funktioniertEs gibt ein Knotenpaket für alles. Es ist plattformübergreifend und einfach zu bedienen.
Dies ist ein kontroverser Ansatz, aber die Verwendung von npm für Werkzeuge wird immer beliebter, ob es Ihnen gefällt oder nicht.
quelle
Wenn Sie die Netzwerkschnittstelle kennen (eth0, wlan, tun0 usw.):
quelle
quelle
quelle
Funktioniert unter Mac, Linux und in Docker Containern:
$ hostname --ip-address 2> /dev/null || (ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p' | awk '{print
$ 1; Ausfahrt}')Funktioniert auch
Makefile
als:LOCAL_HOST := ${shell hostname --ip-address 2> /dev/null || (ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p' | awk '{print $1; exit}')}
quelle
hostname --ip-address
=>hostname: illegal option -- -
unter macOS SierraFür Linux benötigen Sie den folgenden Befehl:
Geben Sie dies in Ihre Shell ein und Sie werden einfach Ihre IP kennen.
quelle
Dies ist leichter zu lesen:
ifconfig | grep 'inet addr:' |/usr/bin/awk '{print $2}' | tr -d addr:
quelle
Wenn Sie haben
npm
undnode
installiert haben:npm install -g ip && node -e "const ip = require('ip'); console.log(ip.address())"
quelle