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.