Antworten:
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 | 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)
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
@ 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:
ip -o -4 a | awk '$2 == "eth0" { gsub(/\/.*/, "", $4); print $4 }'
-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.
ip
Fahnen. Verwenden cut
statt fortgeschrittener awk
Zauberei:ip -o -4 addr show eth0 scope global | awk '{print $4;}' | cut -d/ -f 1
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.
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+'
\K
Verwirft 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.
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 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:
$ 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
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]
ip addr|awk '/eth0/ && /inet/ {gsub(/\/[0-9][0-9]/,""); print $2}'
Diese einzige Verwendung ip addr
ist ein Ersatz für ifconfig
und awk
kombiniert mit Substitution (gsub).
Verwenden Sie nicht mehr zu viele Prozesse für einfache Aufgaben
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}"
ifconfig eth0|grep 'inet '|awk '{print $2}'
Dies kann auch mit einem normalen Benutzer verwendet werden.
ip addr show eth0 | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
ip addr show | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
cut
zweimal anstelle einer Kombination aus awk
und 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.
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.
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;)
ip
, verwenden Sie die -o
Option.
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.