Comment capturer la première adresse IP d'une commande ifconfig?

9

Comment capturer la première adresse IP qui vient de la ifconfigcommande?

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

Résultat attendu:

IP=100.14.22.12
Yael
la source
3
On a répondu à la question, en utilisant awk ou grep / cut, etc. Mais c'est toujours une mauvaise idée en général d'utiliser et grep d'ifconfig. ip est mieux adapté et mieux pris en charge dans les versions Linux modernes.
Pedro
1
Cela ressemble à un problème XY. Quelles informations voulez-vous vraiment? L'adresse IP principale face au réseau de la machine? Toute adresse IP réseau de la machine? L'adresse IP de la première carte réseau? Toute adresse IP, peu importe ce que c'est? Il existe probablement un moyen plus direct, précis et portable d'obtenir les informations dont vous avez besoin.
alex.forencich

Réponses:

20

Il vaut mieux éviter d'utiliser ifconfigpour obtenir une adresse IP dans un script car il est déconseillé dans certaines distributions (par exemple CentOS et autres, ne l'installez plus par défaut).

Dans d'autres systèmes, la sortie d'ifconfig varie selon la version de la distribution (par exemple, la sortie / l'espacement / les champs de ifconfigdiffèrent de Debian 8 à Debian 9, par exemple).

Pour obtenir l'adresse IP avec ip, de la même manière, vous demandez:

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

Ou mieux encore:

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

Ou, comme vous le demandez "IP ="

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

Adapter sans vergogne l'idée de @Roman

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

Sortie normale:

 $ 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

De man ip:

-o, -oneline affiche
chaque enregistrement sur une seule ligne, en remplaçant les sauts de ligne par le caractère '\'. C'est pratique lorsque vous souhaitez compter les enregistrements avec wc (1) ou grep (1) la sortie.

Voir un exemple de pourquoi ifconfign'est pas conseillé: BBB: `bbb-conf --check` montrant les adresses IP comme` inet` - ifconfig woes

Pour comprendre pourquoi ifconfigest sur le point de sortir, voir Différence entre les commandes «ifconfig» et «ip»

ifconfigprovient de net-tools, qui n'a pas été en mesure de suivre pleinement la pile réseau Linux depuis longtemps. Il utilise également ioctl pour la configuration du réseau, qui est un moyen laid et moins puissant d'interagir avec le noyau.

Vers 2005, un nouveau mécanisme de contrôle de la pile réseau a été introduit: les sockets netlink.

Pour configurer l'interface réseau, il iproute2utilise ce mécanisme de socket netlink en duplex intégral, tout en ifconfigs'appuyant sur un appel système ioctl.

Rui F Ribeiro
la source
Je préfère ne pas définir eth0 par défaut parce que ce nom change sur les machines, pouvons-nous fournir une syntaxe flexible
yael
@yael a changé, a retiré eth0. Cependant, Roman a fait mieux que moi en imprimant le "IP =" à l'intérieur awk. Trop de cervelle pour moi, toujours en train de me réveiller. Évitez ifconfig, il n'a pas d'avenir, et la position des changements d'adresse IP, il y a au moins deux versions / implémentations différentes (?) Pour Linux que je connais.
Rui F Ribeiro
Juste pour info, sur les versions plus récentes d'iproute2 (ex: pas sur CentOS7 ni Debian8) ip peut prendre un -briefparamètre et sa sortie devient plus facile à analyser (2015-08-31: git.kernel.org/pub/scm/network/iproute2 /iproute2.git/commit/… )
AB
@AB aussi -o que j'utilise aide, merci, va le vérifier ou
Rui F Ribeiro
1
Ah, je ne savais pas ce -oqui semble effectivement utile pour les scripts
AB
6

Awk Solution:

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

Exemple de sortie:

IP=10.0.2.15
RomanPerekhrest
la source
-3
ip addr | grep -v 127.0.0.1 | grep 'inet ' | \
awk {'print $2'} | awk -F "/" {'print "IP="$1'}
Brian Olson
la source
1
voir ceci:ip addr | awk ' !/127.0.0.1/ && /inet/ { gsub(/\/.*/, "", $2); print "IP="$2 } '
Rui F Ribeiro
1
Pourquoi recherchez-vous l'IP localhost 127.0.0.1?
Jeff Schaller