Wie kann ich die auf eth0 angezeigte IP-Adresse mithilfe eines Skripts anzeigen?
24
Speichern Sie dies in einer Datei und führen Sie dann bash <filename>
#!/bin/bash
ifconfig eth0 | grep "inet addr"
Genauer gesagt, um nur die Nummer zu erhalten, die die IP-Adresse anzeigt:
#!/bin/bash
ifconfig eth0 | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1
Update : Wenn dies bei Ihnen nicht funktioniert, versuchen Sie es mit der anderen Antwort
grep "inet"
Um eine weitere Option bereitzustellen, können Sie den
ip addr
Befehl folgendermaßen verwenden, um die IP-Adresse abzurufen:ip addr show eth0
zeigt Informationen übereth0
grep "inet\b"
zeigt nur die Zeile mit der IPv4-Adresse an (wenn Sie die IPv6-Adresse haben möchten, ändern Sie sie in"inet6\b"
)awk '{print $2}'
druckt auf das zweite Feld, das die IP-Adresse / Maske hat, Beispiel172.20.20.15/25
cut -d/ -f1
Nimmt nur den IP-Adressbereich.In einem Skript:
quelle
Entnommen aus /programming//a/14910952/1695680
Dies kann jedoch eine lokale IP-Adresse (127.0.0.1) zurückgeben, sodass Sie möglicherweise Folgendes verwenden und filtern müssen:
Aus den Manpages des Hostnamens:
quelle
ip addr show label 'enp*'
ip addr show label 'enp*' | grep -oP inet\ \\S+ | cut -d' ' -f2
@ markus-lindbergs antwort ist mein lieblings. Wenn Sie
-o -4
zu ip's Flags hinzufügen , erhalten Sie eine viel einfacher zu analysierende (und konsistente) Ausgabe:-o
steht für--oneline
, was genau in solchen Situationen helfen soll. Das-4
wird hinzugefügt, um die IPv4-Adresse einzuschränken, was alle anderen Antworten implizieren.quelle
ip
Fahnen. Verwendencut
statt fortgeschrittenerawk
Zauberei:ip -o -4 addr show eth0 scope global | awk '{print $4;}' | cut -d/ -f 1
cut
, nachdem ich davon erfahren habeawk
, und ich mag es, die Anzahl der Befehle in meinen Pipelines zu minimieren. Netter Vorschlag auf jeden Fall.Hier sind einige Oneliner .....
Awk
Die Funktion split im obigen Befehl awk teilt die zweite Spalte basierend auf dem Begrenzer
:
und speichert den aufgeteilten Wert in einem assoziativen Arraya
. Soa[2]
bleibt der Wert des zweiten Teils.sed
In der Grundeinstellung
\(...\)
"Erfassungsgruppe", die zum Erfassen der Charaktere verwendet wird. Wir könnten diese erfassten Zeichen durch Rückverweisen referenzieren.\([^[:space:]]\+\)
Erfasst ein beliebiges Zeichen, jedoch nicht ein oder mehrere Leerzeichen.grep
\K
Verwirft die zuvor übereinstimmenden Zeichen vom endgültigen Ausdruck und\S+
stimmt mit einem oder mehreren Zeichen überein, die keine Leerzeichen enthalten.Perl
Ein oder mehrere Nicht-Leerzeichen, die sich neben der
inet addr:
Zeichenfolge befinden, werden erfasst, und schließlich werden nur diese erfassten Zeichen gedruckt.quelle
Hier ist ein guter Befehl, der nur grep als sekundären Befehl verwendet:
ip addr show eth0 | grep -oP 'inet \ K \ S [0-9.] +'
Ich verstehe nicht, warum Sie mehr Befehle als nötig verwenden sollten
quelle
Du solltest benutzen
ip
(anstelle vonifconfig
) verwenden, da es aktuell, gewartet und möglicherweise am wichtigsten für Skriptzwecke ist. Es erzeugt eine konsistente und analysierbare Ausgabe. Es folgen einige ähnliche Ansätze:Wenn Sie die IPv4-Adresse für Ihre Ethernet-Schnittstelle möchten
eth0
:Als Drehbuch:
Die oben erzeugte Ausgabe erfolgt in CIDR-Notation. Wenn die CIDR-Notation nicht gewünscht ist, kann sie entfernt werden:
Eine weitere Option, bei der IMHO "am elegantesten" ist, ist das Abrufen der IPv4-Adresse für die Schnittstelle, über die die Verbindung zum angegebenen Remotehost hergestellt wird (in diesem Fall 8.8.8.8). Mit freundlicher Genehmigung von @gatoatigrado in dieser Antwort :
Als Drehbuch:
Dies funktioniert perfekt auf einem Host mit einer einzelnen Schnittstelle, vorteilhafter jedoch auch auf Hosts mit mehreren Schnittstellen und / oder Routenspezifikationen.
Obwohl
ip
dies mein bevorzugter Ansatz wäre, ist dies sicherlich nicht der einzige Weg, diese Katze zu häuten. Hier ist ein weiterer Ansatz, der verwendet wird,hostname
wenn Sie etwas Einfacheres / Prägnanteres bevorzugen:Oder, wenn Sie die IPv6-Adresse möchten:
Als Drehbuch:
quelle
Ich schlage vor, eine Python-Bibliothek wie Netifaces zu verwenden , die speziell für diesen Zweck entwickelt wurde.
So rufen Sie die verwendete Standardnetzwerkschnittstelle ab
quelle
Diese einzige Verwendung
ip addr
ist ein Ersatz fürifconfig
undawk
kombiniert mit Substitution (gsub).Verwenden Sie nicht mehr zu viele Prozesse für einfache Aufgaben
quelle
Nur eine weitere Option, die nützlich sein kann, wenn Sie keine awk haben (wie dies bei einigen eingebetteten Geräten der Fall ist):
quelle
ifconfig eth0|grep 'inet '|awk '{print $2}'
quelle
Hier ist für IPv4 :
ip -f inet a|grep -oP "(?<=inet ).+(?=\/)"
hier ist für IPv4 und insbesondere dev (eth0):
ip -f inet a show eth0|grep -oP "(?<=inet ).+(?=\/)"
für IPv6 :
ip -6 -o a|grep -oP "(?<=inet6 ).+(?=\/)"
quelle
Dies kann auch mit einem normalen Benutzer verwendet werden.
quelle
ip addr show | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
cut
zweimal anstelle einer Kombination ausawk
undcut
, um die Ausgabe zu analysieren. Beim nächsten Mal sollten Sie zuerst alle anderen Antworten überprüfen und sicherstellen, dass Sie keine doppelte Lösung veröffentlichen. In diesem Fall ist es meines Erachtens fraglich, ob es sich um ein Duplikat oder nur um ein ähnliches handelt. Nehmen Sie es also bitte als allgemeinen Hinweis. Vielen Dank.Dies ist der kürzeste Weg, den ich finden konnte:
ip -f inet addr show $1 | grep -Po 'inet \K[\d.]+'
Ersetzen
$1
durch Ihre Netzwerkschnittstelle.ip -f inet
Weist ip an, nur Werte für die inet (ipv4) -Familie zurückzugeben.grep -Po
weist grep an, den nächsten Wert als Perl-Regex zu interperieren und nur die übereinstimmenden Werte auszudrucken.Die Regex
\K[\d.]+
sagt "wirf alles bis zu diesem Punkt weg (\ K) und gib so viele numerische Werte wie möglich ein, gefolgt von einem Punkt in einer Reihe". Dies stimmt daher nur mit der IP-Adresse überein und ignoriert alles danach, einschließlich der Kurzform \ XX-Subnetzmaske.quelle
in diesen zeiten mit multiplen schnittstellen (zb wenn sie einen docker benutzen) und namensschnittstellen von der eth sind nicht mehr die normen
Ich benutze diesen Befehl, um die IP / Maske zu extrahieren:
Unabhängig von der Anzahl der Schnittstellen und deren Namen greift GREP nur auf die erste mit der Option MULTICAST zu.
Ich benutze diesen Befehl, um nur die IP ohne die Maske zu extrahieren:
Ich benutze diesen Befehl auf verschiedenen BDS & NIX es scheitert nie;)
quelle
ip
, verwenden Sie die-o
Option.In meinem Skript verwende ich so etwas:
Es wird kein Prozess erzeugt.
quelle
Noch ein anderer Weg (vorausgesetzt, Sie wollen keine
CIDR
Adresse und wollenIPv4
):ip
Befehl, der nicht istdeprecated
quelle