È meglio evitare di usare ifconfig
per ottenere un indirizzo IP in uno script poiché è deprecato in alcune distribuzioni (ad esempio CentOS e altri, non installarlo più per impostazione predefinita).
In altri sistemi, l'output di ifconfig varia a seconda del rilascio della distribuzione (ad esempio l'output/spaziatura/campi di ifconfig
differisce da Debian 8 a Debian 9, per esempio).
Per ottenere l'indirizzo IP con ip
, in modo simile stai chiedendo:
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, come 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, -una riga
emette ogni record su una singola riga, sostituendo i line feed con il carattere '\'. Questo è comodo quando vuoi contare i record con wc(1) o grep(1) l'output.
Guarda un esempio del perché ifconfig
non è consigliato:BBB:`bbb-conf --check` che mostra gli indirizzi IP come `inet` - ifconfig guai
Per capire perché ifconfig
sta per uscire, vedi Differenza tra i comandi 'ifconfig' e 'ip'
ifconfig
proviene da net-tools, che non è stato in grado di tenere il passo con lo stack di rete Linux per molto tempo. Utilizza ancora ioctl anche 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
iproute2
fa uso di quel meccanismo di socket netlink full-duplex, mentreifconfig
si basa sulla chiamata di sistema anioctl.
Awk
soluzione:
ifconfig -a | awk 'NR==2{ sub(/^[^0-9]*/, "", $2); printf "IP=%s\n", $2; exit }'
Esempio di output:
IP=10.0.2.15