Wie erfasse ich die erste IP-Adresse aus einem ifconfig-Befehl?

9

Wie erfasse ich die erste IP-Adresse, die vom ifconfigBefehl kommt?

ifconfig -a
enw178032: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 100.14.22.12  netmask 255.255.0.0  broadcast 100.14.255.255
        inet6 fe80::250:56ff:fe9c:158a  prefixlen 64  scopeid 0x20<link>
        ether 00:10:56:9c:65:8a  txqueuelen 1000  (Ethernet)
        RX packets 26846250  bytes 12068811576 (11.2 GiB)
        RX errors 0  dropped 58671  overruns 0  frame 0
        TX packets 3368855  bytes 1139160934 (1.0 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Erwartetes Ergebnis:

IP=100.14.22.12
Yael
quelle
3
Die Frage wurde beantwortet, entweder mit awk oder grep / cut usw. Aber es ist im Allgemeinen immer noch eine schlechte Idee, ifconfig zu verwenden und grep. ip ist in modernen Linux-Builds besser geeignet und wird besser unterstützt.
Pedro
1
Das klingt nach einem XY-Problem. Welche Informationen möchten Sie wirklich? Die Hauptnetzwerk-IP-Adresse des Geräts? Eine netzwerkfähige IP-Adresse des Geräts? Die IP-Adresse des ersten Netzwerkadapters? Irgendeine IP-Adresse, egal was es ist? Es gibt wahrscheinlich eine direktere, genauere und tragbarere Möglichkeit, die benötigten Informationen abzurufen.
Alex. Forencich

Antworten:

19

Es ist besser, die Verwendung ifconfigzum Abrufen einer IP-Adresse in einem Skript zu vermeiden, da diese in einigen Distributionen veraltet ist (z. B. CentOS und andere, installieren Sie sie nicht mehr standardmäßig).

In anderen Systemen variiert die Ausgabe von ifconfig je nach Version der Distribution (z. B. unterscheidet sich die Ausgabe / der Abstand / die Felder von beispielsweise ifconfigvon Debian 8 bis Debian 9).

Um die IP-Adresse mit zu erhalten ip, fragen Sie auf ähnliche Weise:

ip addr | awk ' !/127.0.0.1/ && /inet/ { gsub(/\/.*/, "", $2); print "IP="$2 } '

Oder noch besser:

$ ip -o -4  address show  | awk ' NR==2 { gsub(/\/.*/, "", $4); print $4 } '
192.168.1.249

Oder wenn Sie nach "IP =" fragen

#!/bin/bash
echo -n "IP="
ip -o -4  address show  | awk ' NR==2 { gsub(/\/.*/, "", $4); print $4 } '

Die Idee von @Roman schamlos anpassen

$ ip -o -4  address show  | awk ' NR==2 { gsub(/\/.*/, "", $4); print "IP="$4 } ' 
IP=192.168.1.249

Normale Ausgabe:

 $ ip -o -4  address show 
1: lo    inet 127.0.0.1/8 scope host lo\       valid_lft forever preferred_lft forever
2: eth0    inet 192.168.1.249/24 brd 192.168.1.255 scope global eth0\       valid_lft forever preferred_lft forever

Von man ip:

-o, -oneline gibt
jeden Datensatz in einer einzelnen Zeile aus und ersetzt Zeilenvorschübe durch das Zeichen '\'. Dies ist praktisch, wenn Sie Datensätze mit wc (1) zählen oder die Ausgabe grep (1) möchten.

Sehen Sie sich ein Beispiel an, warum dies ifconfignicht empfohlen wird: BBB: `bbb-conf --check` zeigt IP-Adressen als` inet` - ifconfig an

Informationen zum Grund ifconfigfür den Weg nach draußen finden Sie unter Unterschied zwischen den Befehlen 'ifconfig' und 'ip'

ifconfigstammt von Net-Tools, die lange Zeit nicht mehr mit dem Linux-Netzwerkstack Schritt halten konnten. Außerdem wird ioctl weiterhin für die Netzwerkkonfiguration verwendet, was eine hässliche und weniger leistungsfähige Art der Interaktion mit dem Kernel darstellt.

Um 2005 wurde ein neuer Mechanismus zur Steuerung des Netzwerkstapels eingeführt - Netlink-Sockets.

Für die Konfiguration der Netzwerkschnittstelle iproute2wird dieser Vollduplex-Netlink-Socket-Mechanismus verwendet, während ifconfigein ioctl-Systemaufruf erforderlich ist.

Rui F Ribeiro
quelle
Ich ziehe es nicht seteth0 als Standard , da dieser Name auf Maschinen ändern, können wir bieten flexible Syntax
Yael
@yael geändert, eth0 herausgenommen. Allerdings hat Roman es besser gemacht als ich, das "IP =" darin zu drucken awk. Zu viel Brainpower für mich, immer noch wach. Vermeiden Sie ifconfig, es hat keine Zukunft, und die Position der IP-Adresse ändert sich, es gibt mindestens zwei verschiedene Versionen / Implementierungen (?) Für Linux da draußen, die ich kenne.
Rui F Ribeiro
Nur zur Information: Bei neueren Versionen von iproute2 (z. B. nicht bei CentOS7 oder Debian8) kann ip einen -briefParameter annehmen und seine Ausgabe wird einfacher zu analysieren (2015-08-31: git.kernel.org/pub/scm/network/iproute2) /iproute2.git/commit/… )
AB
@AB auch -o wie ich benutze hilft, danke, werde es überprüfen ou
Rui F Ribeiro
1
Ah, ich wusste nicht, -owas für Skripte
AB
6

Awk Lösung:

ifconfig -a | awk 'NR==2{ sub(/^[^0-9]*/, "", $2); printf "IP=%s\n", $2; exit }'

Beispielausgabe:

IP=10.0.2.15
RomanPerekhrest
quelle
-3
ip addr | grep -v 127.0.0.1 | grep 'inet ' | \
awk {'print $2'} | awk -F "/" {'print "IP="$1'}
Brian Olson
quelle
1
siehe dies:ip addr | awk ' !/127.0.0.1/ && /inet/ { gsub(/\/.*/, "", $2); print "IP="$2 } '
Rui F Ribeiro
1
Warum suchen Sie nach der localhost IP 127.0.0.1?
Jeff Schaller