Visualizzazione dell'indirizzo IP sull'interfaccia eth0


24

Come posso visualizzare l'indirizzo IP mostrato su eth0 usando uno script?

Risposte:


28

salvarlo in un file ed eseguirlo bash <filename>

#!/bin/bash
ifconfig eth0 | grep "inet addr"

essendo più preciso per ottenere solo un numero che mostra l'indirizzo IP:

#!/bin/bash
ifconfig eth0 | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1

Aggiornamento : se questo non funziona per te, prova l' altra risposta


2
ovviamente questo non funziona nell'ultima Ubuntu. le ultime dichiarazioni ifconfig "inet <IP>" al posto di "inet addr <IP>"
thang

puoi semplicemente usaregrep "inet"
Andrei Radulescu il

26

Per fornire un'altra opzione, è possibile utilizzare il ip addr comando in questo modo per ottenere l'indirizzo IP:

ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1
  • ip addr show eth0 mostra informazioni su eth0
  • grep "inet\b"mostra solo la riga che ha l'indirizzo IPv4 (se si desidera l'indirizzo IPv6, cambiarlo in "inet6\b")
  • awk '{print $2}' stampa sul secondo campo, che contiene l'esempio / maschera ipad 172.20.20.15/25
  • cut -d/ -f1 accetta solo la parte dell'indirizzo IP.

In uno script:

#!/bin/bash
theIPaddress=$(ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)

questa soluzione funziona davvero!
Grazie

ip -4 ... e ip -6 ...! Grazie!
TamusJRoyce,

17

Tratto da /programming//a/14910952/1695680

hostname -i

Tuttavia, ciò potrebbe restituire un indirizzo IP locale (127.0.0.1), quindi potrebbe essere necessario utilizzare e filtrare:

hostname -I

Dalle manpage dell'hostname:

-i, --ip-address

Visualizza gli indirizzi di rete del nome host. Nota che funziona solo se il nome host può essere risolto. Evita di usare questa opzione; usa invece hostname --all-ip-address.

-I, --all-ip-addresses

Visualizza tutti gli indirizzi di rete dell'host. Questa opzione elenca tutti gli indirizzi configurati su tutte le interfacce di rete. L'interfaccia di loopback e gli indirizzi link-local IPv6 sono omessi. Contrariamente all'opzione -i, questa opzione non dipende dalla risoluzione dei nomi. Non fare ipotesi sull'ordine dell'output.


per la cronaca, mi piace di ip addr show label 'enp*'più, ma sto analizzando noioso, qualcosa di simile ip addr show label 'enp*' | grep -oP inet\ \\S+ | cut -d' ' -f2può funzionare ... che bello
ThorSummoner,

5

La risposta di @ markus-Lindberg è la mia preferita. Se aggiungi-o -4 ai flag di ip otterrai un output molto più facilmente analizzabile (e coerente):

ip -o -4 a | awk '$2 == "eth0" { gsub(/\/.*/, "", $4); print $4 }'

-osta per --oneline, che è pensato per aiutare esattamente in questo tipo di situazioni. La -4si aggiunge al limite l'indirizzo IPv4, che è quello che tutti gli altri risposte implicano.


Adoro le ipbandiere. Usando cutpiuttosto che la awkmagia avanzata :ip -o -4 addr show eth0 scope global | awk '{print $4;}' | cut -d/ -f 1
DuffJ

@DuffJ probabilmente è una questione di gusti personali. Ho "scoperto" cutmolto dopo aver appreso awke mi piace ridurre al minimo il numero di comandi sulle mie pipeline. Bel suggerimento in ogni caso.
Amos Shapira,

Sono completamente d'accordo, Amos. Grazie per la tua soluzione!
DuffJ,

3

Ecco alcuni oneliners .....

awk

ifconfig eth0 | awk '/inet addr/{split($2,a,":"); print a[2]}'

la funzione split nel comando awk sopra divide la seconda colonna in base al delimitatore : e memorizza il valore suddiviso in un array associativo a. Quindi a[2]detiene il valore della seconda parte.

sed

ifconfig eth0 | sed -n '/inet addr/s/.*inet addr: *\([^[:space:]]\+\).*/\1/p'

In sed di base, \(...\)chiamato gruppo di acquisizione che viene utilizzato per catturare i personaggi. Potremmo riferire quei personaggi catturati tramite riferimenti a ritroso.\([^[:space:]]\+\)cattura qualsiasi personaggio ma non lo spazio una o più volte.

grep

ifconfig eth0 | grep -oP 'inet addr:\K\S+'

\K scarta i caratteri precedentemente abbinati dalla stampa in finale e \S+ uno o più caratteri non spaziali.

Perl

ifconfig eth0 | perl -lane 'print $1 if /inet addr:(\S+)/'

Uno o più caratteri non spaziali che si trovano accanto alla inet addr:stringa vengono catturati e infine stampiamo solo quei caratteri catturati.


@edwardtorvalds ha aggiunto alcune spiegazioni. Penso che questo sarebbe utile per i futuri lettori. Sentiti libero di porre qualsiasi domanda dai comandi sopra ... :)
Avinash Raj,

2

Eccone uno buono, usa solo grep come comando secondario:

ip addr show eth0 | grep -oP 'inet \ K \ S [0-9.] +'

Non vedo perché dovresti usare più comandi del necessario


2

Dovresti usare ip(invece diifconfig ) come è attuale, mantenuto e forse soprattutto per scopi di scripting, produce un output coerente e analizzabile. Di seguito sono riportati alcuni approcci simili:

Se si desidera l'indirizzo IPv4 per l'interfaccia Ethernet eth0:

$ ip -4 -o addr show eth0 | awk '{print $4}'
192.168.1.166/24  

Come una sceneggiatura:

$ INTFC=eth0  
$ MYIPV4=$(ip -4 -o addr show $INTFC | awk '{print $4}') 
$ echo $MYIPV4
192.168.1.166/24

L'output prodotto sopra è in notazione CIDR. Se la notazione CIDR non è desiderata, può essere rimossa:

$ ip -4 -o addr show eth0 | awk '{print $4}' | cut -d "/" -f 1 
192.168.1.166  

Un'altra opzione che IMHO è "più elegante" ottiene l'indirizzo IPv4 per qualunque interfaccia venga utilizzata per connettersi all'host remoto specificato (8.8.8.8 in questo caso). Per gentile concessione di @gatoatigrado in questa risposta :

$ ip route get 8.8.8.8 | awk '{ print $NF; exit }'
192.168.1.166

Come una sceneggiatura:

$ RHOST=8.8.8.8  
$ MYIP=$(ip route get $RHOST | awk '{ print $NF; exit }')
$ echo $MYIP
192.168.1.166

Funziona perfettamente su un host con una singola interfaccia, ma più vantaggiosamente funzionerà anche su host con più interfacce e / o specifiche di route.

Mentre ipsarebbe il mio approccio preferito, non è certamente l'unico modo per scuoiare questo gatto. Ecco un altro approccio che utilizza hostnamese preferisci qualcosa di più semplice / più conciso:

$ hostname --all-ip-addresses | awk '{print $1}'  

Oppure, se si desidera l'indirizzo IPv6:

$ hostname --all-ip-addresses | awk '{print $2}'  

Come una sceneggiatura:

$ 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

1

Suggerisco di usare una libreria Python come netifaces progettata appositamente per questo scopo.

sudo pip install netifaces
python -c "import netifaces; print netifaces.ifaddresses('eth0')[netifaces.AF_INET][0]['addr']"

Per ottenere l'interfaccia di rete predefinita in uso.

default_inf = netifaces.gateways()['default'][netifaces.AF_INET][1]


1

Solo un'altra opzione che può essere utile se non hai awk (come è il caso in alcuni dispositivi integrati):

ip addr show dev eth0 scope global | grep "inet\b" | cut -d/ -f 1 | egrep -o "([[:digit:]]{1,3}[.]{1}){3}[[:digit:]]{1,3}"


1

ecco per IPv4 :

ip -f inet a|grep -oP "(?<=inet ).+(?=\/)"

ecco per IPv4 e particolare dev (eth0):

ip -f inet a show eth0|grep -oP "(?<=inet ).+(?=\/)"

per IPv6 :

ip -6 -o a|grep -oP "(?<=inet6 ).+(?=\/)"


0

questo può essere utilizzato anche con un utente normale.

ip addr show eth0 | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6

chiede eth0, questa versione del tuo script potrebbe essere d'aiuto (mostra anche loopback)ip addr show | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
TiloBunt

Questa è praticamente la stessa risposta di askubuntu.com/a/560466/367990 , usando solo cutdue volte invece di una combinazione di awke cutper analizzare l'output. La prossima volta dovresti controllare prima tutte le altre risposte e assicurarti di non pubblicare una soluzione duplicata. In questo caso, penso che sia discutibile che si tratti di un duplicato o semplicemente simile, quindi per favore prendilo come un suggerimento generale. Grazie.
Byte Commander

0

Questo è il modo più breve che ho trovato:

ip -f inet addr show $1 | grep -Po 'inet \K[\d.]+'

Sostituire $1 con la tua interfaccia di rete.

ip -f inet indica a ip di restituire solo i valori per la famiglia inet (ipv4).

grep -Po dice a grep di interferire con il valore successivo come perl-regex e di stampare solo i valori corrispondenti.

La regex \K[\d.]+dice "butta via tutto fino a questo punto (\ K) e abbina il maggior numero possibile di valori numerici seguiti da un punto in una riga". Questo pertanto corrisponderà solo all'indirizzo IP e ignorerà tutto ciò che lo segue, inclusa la maschera di sottorete shortform \ XX.


0

in questi giorni con interfacce multiple (ad esempio se si utilizza una finestra mobile) e l'interfaccia di denominazione di ETH non è più la norma

Uso questo comando per estrarre l'IP / Mask:

IPMASK=$(ip a s|grep -A8 -m1 MULTICAST|grep -m1 inet|cut -d' ' -f6)

Quindi, indipendentemente da quante interfacce avrò e qualunque sia il loro nome, GREP prenderà solo il primo con l'opzione MULTICAST.

Uso questo comando per estrarre solo l'IP senza la maschera:

IP=$(ip a s|grep -A8 -m1 MULTICAST|grep -m1 inet|cut -d' ' -f6|cut -d'/' -f1)

Uso questi comandi su diversi BDS e NIX che non falliscono mai;)


Se stai per analizzare l'output di ip, usa l' -oopzione.
muru,

0

Nella mia sceneggiatura sto usando qualcosa del genere:

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

Non genera alcun processo.


0

Ancora un altro modo (supponendo che tu non voglia un CIDRindirizzo e desideri IPv4):

$ ip -br -4 addr show dev eth0 | awk '{split($3,a,"/"); print a[1]}'
  • Usa il ipcomando che non lo èdeprecated
  • Utilizza solo un comando per il filtro
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.