Come acquisire il primo indirizzo IP da un comando ifconfig?


9

Come acquisire il primo indirizzo IP che viene dal ifconfigcomando?

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

Risultato atteso:

IP=100.14.22.12

3
Alla domanda è stata data una risposta, usando awk o grep / cut, ecc. Ma è comunque una cattiva idea in generale usare e grep da ifconfig. ip è più adatto e meglio supportato nelle moderne build Linux.
Pedro,

1
Sembra un problema XY. Quali informazioni vuoi davvero? L'indirizzo IP principale della rete della macchina? Qualche indirizzo IP della rete della macchina? L'indirizzo IP della prima scheda di rete? Qualsiasi indirizzo IP, non importa di cosa si tratta? Esiste probabilmente un modo più diretto, preciso e portatile per ottenere le informazioni di cui hai bisogno.
alex.forencich,

Risposte:


20

È meglio evitare di utilizzare ifconfigper ottenere un indirizzo IP in uno script che è deprecato in alcune distribuzioni (ad esempio CentOS e altri, non installarlo più per impostazione predefinita).

In altri sistemi, l'output di ifconfig varia in base al rilascio della distribuzione (ad esempio output / spaziatura / campi ifconfigdifferisce da Debian 8 a Debian 9, per esempio).

Per ottenere l'indirizzo IP con ip, in un modo simile si chiede:

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

O meglio ancora:

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

Oppure, quando chiedi "IP ="

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

Adattando spudoratamente l'idea di @Roman

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

Uscita 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

Da man ip:

-o, -online genera
ogni record su una singola riga, sostituendo i feed di riga con il carattere '\'. Questo è utile quando si desidera contare i record con wc (1) o grep (1) l'output.

Vedi un esempio del perché ifconfignon è consigliato: BBB: `bbb-conf --check` mostra gli indirizzi IP come` inet` - ifconfig woes

Per capire perché ifconfigsta uscendo, vedere Differenza tra i comandi 'ifconfig' e 'ip'

ifconfigproviene da net-tools, che non è stato in grado di tenere il passo con lo stack di rete Linux per molto tempo. Inoltre utilizza ancora ioctl per la configurazione di rete, che è un modo brutto e meno potente di interagire con il kernel.

Intorno al 2005 è stato introdotto un nuovo meccanismo per il controllo dello stack di rete: i socket netlink.

Per configurare l'interfaccia di rete si iproute2utilizza quel meccanismo di socket netlink full-duplex, mentre ifconfigsi basa su una chiamata di sistema ioctl.


Preferisco non impostare eth0 come predefinito perché questo nome cambia su macchine, possiamo fornire una sintassi flessibile
yael

@yael Changed, ha eliminato eth0. Comunque Roman ha fatto meglio di me stampando "IP =" all'interno awk. Troppa potenza del cervello per me, mi sveglio ancora. Evita ifconfig, non ha futuro e la posizione dell'indirizzo IP cambia, ci sono almeno due diverse versioni / implementazioni (?) Per Linux là fuori che conosco.
Rui F Ribeiro,

Solo per informazioni, sulle versioni più recenti di iproute2 (es. Non su CentOS7 né Debian8) l'ip può prendere un -briefparametro e il suo output diventa più facile da analizzare (2015-08-31: git.kernel.org/pub/scm/network/iproute2 /iproute2.git/commit/… )
AB

@AB anche -o mentre uso aiuta, grazie, lo controllerò ou
Rui F Ribeiro,

1
Ah, non sapevo -oquale fosse effettivamente utile per gli script
AB

6

Awk soluzione:

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

Uscita campione:

IP=10.0.2.15

-3
ip addr | grep -v 127.0.0.1 | grep 'inet ' | \
awk {'print $2'} | awk -F "/" {'print "IP="$1'}

1
vedi questo:ip addr | awk ' !/127.0.0.1/ && /inet/ { gsub(/\/.*/, "", $2); print "IP="$2 } '
Rui F Ribeiro,

1
Perché stai effettuando il grepping per localhost IP 127.0.0.1?
Jeff Schaller
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.