Anzeigen der IP-Adresse auf der eth0-Schnittstelle


24

Wie kann ich die auf eth0 angezeigte IP-Adresse mithilfe eines Skripts anzeigen?

Antworten:


28

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


2
Natürlich funktioniert das im neuesten Ubuntu nicht. die neuesten ifconfig returns "inet <ip>" anstelle von "inet addr <ip>"
thang

Sie können nur verwendengrep "inet"
Andrei Radulescu

26

Um eine weitere Option bereitzustellen, können Sie den ip addrBefehl folgendermaßen verwenden, um die IP-Adresse abzurufen:

ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1
  • ip addr show eth0 zeigt Informationen über eth0
  • 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, Beispiel 172.20.20.15/25
  • cut -d/ -f1 Nimmt nur den IP-Adressbereich.

In einem Skript:

#!/bin/bash
theIPaddress=$(ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)

Diese Lösung funktioniert tatsächlich!
Do

ip -4 ... und ip -6 ...! Vielen Dank!
TamusJRoyce

17

Entnommen aus /programming//a/14910952/1695680

hostname -i

Dies kann jedoch eine lokale IP-Adresse (127.0.0.1) zurückgeben, sodass Sie möglicherweise Folgendes verwenden und filtern müssen:

hostname -I

Aus den Manpages des Hostnamens:

-i, --ip-address

Zeigen Sie die Netzwerkadresse (n) des Hostnamens an. Beachten Sie, dass dies nur funktioniert, wenn der Hostname aufgelöst werden kann. Vermeiden Sie diese Option. Verwenden Sie stattdessen den Hostnamen --all-ip-address.

-I, --all-ip-addresses

Alle Netzwerkadressen des Hosts anzeigen. Diese Option listet alle konfigurierten Adressen auf allen Netzwerkschnittstellen auf. Die Loopback-Schnittstelle und IPv6-Link-Local-Adressen entfallen. Im Gegensatz zur Option -i hängt diese Option nicht von der Namensauflösung ab. Machen Sie keine Annahmen über die Reihenfolge der Ausgabe.


ip addr show label 'enp*'ip addr show label 'enp*' | grep -oP inet\ \\S+ | cut -d' ' -f2
Fürs

5

@ markus-lindbergs antwort ist mein lieblings. Wenn Sie -o -4zu ip's Flags hinzufügen , erhalten Sie eine viel einfacher zu analysierende (und konsistente) Ausgabe:

ip -o -4 a | awk '$2 == "eth0" { gsub(/\/.*/, "", $4); print $4 }'

-osteht für --oneline, was genau in solchen Situationen helfen soll. Das -4wird hinzugefügt, um die IPv4-Adresse einzuschränken, was alle anderen Antworten implizieren.


Ich liebe die ipFahnen. Verwenden cutstatt fortgeschrittener awkZauberei:ip -o -4 addr show eth0 scope global | awk '{print $4;}' | cut -d/ -f 1
DuffJ

@ DuffJ es ist wahrscheinlich eine Frage des persönlichen Geschmacks. Ich habe es "entdeckt" cut, nachdem ich davon erfahren habe awk, und ich mag es, die Anzahl der Befehle in meinen Pipelines zu minimieren. Netter Vorschlag auf jeden Fall.
Amos Shapira

Ich stimme vollkommen zu, Amos. Danke für deine Lösung!
DuffJ

3

Hier sind einige Oneliner .....

Awk

ifconfig eth0 | awk '/inet addr/{split($2,a,":"); print a[2]}'

Die Funktion split im obigen Befehl awk teilt die zweite Spalte basierend auf dem Begrenzer :und speichert den aufgeteilten Wert in einem assoziativen Array a. So a[2]bleibt der Wert des zweiten Teils.

sed

ifconfig eth0 | sed -n '/inet addr/s/.*inet addr: *\([^[:space:]]\+\).*/\1/p'

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

ifconfig eth0 | grep -oP 'inet addr:\K\S+'

\KVerwirft die zuvor übereinstimmenden Zeichen vom endgültigen Ausdruck und \S+stimmt mit einem oder mehreren Zeichen überein, die keine Leerzeichen enthalten.

Perl

ifconfig eth0 | perl -lane 'print $1 if /inet addr:(\S+)/'

Ein oder mehrere Nicht-Leerzeichen, die sich neben der inet addr:Zeichenfolge befinden, werden erfasst, und schließlich werden nur diese erfassten Zeichen gedruckt.


@edwardtorvalds hat eine Erklärung hinzugefügt. Ich denke, das wäre hilfreich für zukünftige Leser. Fühlen Sie sich frei, Fragen zu den oben genannten Befehlen zu stellen ... :)
Avinash Raj

2

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


2

Du solltest benutzen ip (anstelle von ifconfig) 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 :

$ ip -4 -o addr show eth0 | awk '{print $4}'
192.168.1.166/24  

Als Drehbuch:

$ INTFC=eth0  
$ MYIPV4=$(ip -4 -o addr show $INTFC | awk '{print $4}') 
$ echo $MYIPV4
192.168.1.166/24

Die oben erzeugte Ausgabe erfolgt in CIDR-Notation. Wenn die CIDR-Notation nicht gewünscht ist, kann sie entfernt werden:

$ ip -4 -o addr show eth0 | awk '{print $4}' | cut -d "/" -f 1 
192.168.1.166  

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 :

$ ip route get 8.8.8.8 | awk '{ print $NF; exit }'
192.168.1.166

Als Drehbuch:

$ RHOST=8.8.8.8  
$ MYIP=$(ip route get $RHOST | awk '{ print $NF; exit }')
$ echo $MYIP
192.168.1.166

Dies funktioniert perfekt auf einem Host mit einer einzelnen Schnittstelle, vorteilhafter jedoch auch auf Hosts mit mehreren Schnittstellen und / oder Routenspezifikationen.

Obwohl ipdies 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, hostnamewenn Sie etwas Einfacheres / Prägnanteres bevorzugen:

$ hostname --all-ip-addresses | awk '{print $1}'  

Oder, wenn Sie die IPv6-Adresse möchten:

$ hostname --all-ip-addresses | awk '{print $2}'  

Als Drehbuch:

$ MYV4IP=$(hostname --all-ip-addresses | awk '{print $1}') 
$ MYV6IP=$(hostname --all-ip-addresses | awk '{print $2}')
$ echo $MYV4IP
192.168.1.166 
$ echo $MYV6IP 
2601:7c1:103:b27:352e:e151:c7d8:3379

1

Ich schlage vor, eine Python-Bibliothek wie Netifaces zu verwenden , die speziell für diesen Zweck entwickelt wurde.

sudo pip install netifaces
python -c "import netifaces; print netifaces.ifaddresses('eth0')[netifaces.AF_INET][0]['addr']"

So rufen Sie die verwendete Standardnetzwerkschnittstelle ab

default_inf = netifaces.gateways()['default'][netifaces.AF_INET][1]


1

Nur eine weitere Option, die nützlich sein kann, wenn Sie keine awk haben (wie dies bei einigen eingebetteten Geräten der Fall ist):

ip addr show dev eth0 scope global | grep "inet\b" | cut -d/ -f 1 | egrep -o "([[:digit:]]{1,3}[.]{1}){3}[[:digit:]]{1,3}"


1

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 ).+(?=\/)"


0

Dies kann auch mit einem normalen Benutzer verwendet werden.

ip addr show eth0 | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6

er fragt nach eth0, diese version deines skripts könnte helfen (zeige auch ip addr show | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
loopback

Dies ist so ziemlich die gleiche Antwort wie askubuntu.com/a/560466/367990 und verwendet nur cutzweimal anstelle einer Kombination aus awkund cut, 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.
Byte Commander

0

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.


0

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:

IPMASK=$(ip a s|grep -A8 -m1 MULTICAST|grep -m1 inet|cut -d' ' -f6)

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:

IP=$(ip a s|grep -A8 -m1 MULTICAST|grep -m1 inet|cut -d' ' -f6|cut -d'/' -f1)

Ich benutze diesen Befehl auf verschiedenen BDS & NIX es scheitert nie;)


Wenn Sie die Ausgabe von analysieren möchten ip, verwenden Sie die -oOption.
Muru

0

In meinem Skript verwende ich so etwas:

re="inet[[:space:]]+([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)"
if [[ $(ip addr show eth0) =~ $re ]]; then
    echo ${BASH_REMATCH[1]}
else
    echo "Cannot determin IP" 1>&2
fi

Es wird kein Prozess erzeugt.


0

Noch ein anderer Weg (vorausgesetzt, Sie wollen keine CIDRAdresse und wollen IPv4):

$ ip -br -4 addr show dev eth0 | awk '{split($3,a,"/"); print a[1]}'
  • Verwendet den ipBefehl, der nicht istdeprecated
  • Verwendet nur einen Befehl zum Filtern
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.