Come posso visualizzare l'indirizzo IP mostrato su eth0 usando uno script?
Come posso visualizzare l'indirizzo IP mostrato su eth0 usando uno script?
salva questo in un file e poi esegui bash <filename>
#!/bin/bash
ifconfig eth0 | grep "inet addr"
è più preciso ottenere solo il numero che mostra l'indirizzo IP:
#!/bin/bash
ifconfig eth0 | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1
Per fornire un'altra opzione, puoi utilizzare il comando ip addr
in questo modo per ottenere l'indirizzo IP:
ip addr show eth0 | grep "inet\b" | awk '{print }' | cut -d/ -f1
ip addr show eth0
mostra informazioni su eth0
grep "inet\b"
mostra solo la linea che ha l'indirizzo IPv4 (se si desidera l'indirizzo IPv6, modificarlo in "inet6\b"
) awk '{print }'
stampa sul secondo campo, che ha l'indirizzo ip / maschera, esempio 172.20.20.15/25
cut -d/ -f1
prende solo la porzione di indirizzo IP. In uno script:
#!/bin/bash
theIPaddress=$(ip addr show eth0 | grep "inet\b" | awk '{print }' | cut -d/ -f1)
Tratto da link
hostname -i
Tuttavia potrebbe restituire un indirizzo IP locale (127.0.0.1), quindi potrebbe essere necessario utilizzare e filtrare:
hostname -I
Dalle manpage del nome host:
-i, --ip-address
Visualizza l'indirizzo (i) di rete del nome host. Si noti che questo funziona solo se il nome host può essere risolto. Evitare l'uso di questa opzione; usa invece il nome host --all-ip-address.
-I, --all-ip-addresses
Visualizza tutti gli indirizzi di rete dell'host. Questa opzione enumera tutti gli indirizzi configurati su tutte le interfacce di rete. L'interfaccia di loopback e gli indirizzi locali di collegamento IPv6 sono omessi. Contrariamente all'opzione -i, questa opzione non dipende dalla risoluzione dei nomi. Non fare ipotesi circa l'ordine dell'output.
Ecco alcuni oneliner .....
Awk
ifconfig eth0 | awk '/inet addr/{split(,a,":"); print a[2]}'
funzione di divisione nel comando awk sopra suddivide la seconda colonna in base al delimitatore :
e memorizza il valore suddiviso in un array associativo a
. Quindi a[2]
contiene il valore della seconda parte.
sed
ifconfig eth0 | sed -n '/inet addr/s/.*inet addr: *\([^[:space:]]\+\).*//p'
In base a sed, \(...\)
ha chiamato il gruppo di cattura che viene utilizzato per catturare i caratteri. Potremmo riferire quei personaggi catturati attraverso il back-referencing. \([^[:space:]]\+\)
cattura qualsiasi carattere 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 finale e \S+
corrisponde a uno o più caratteri non spaziali.
Perl
ifconfig eth0 | perl -lane 'print if /inet addr:(\S+)/'
Uno o più caratteri non spaziali che si trovano accanto alla stringa inet addr:
vengono catturati e, infine, stampiamo solo quei caratteri catturati.
la risposta di @ markus-lindberg è la mia preferita. Se aggiungi -o -4
ai flag di ip, otterrai un output molto più facilmente parsabile (e coerente):
ip -o -4 a | awk ' == "eth0" { gsub(/\/.*/, "", ); print }'
-o
sta per --oneline
, che è pensato per aiutare esattamente in questo tipo di situazioni. Il -4
viene aggiunto al limite all'indirizzo IPv4, che è quello che implicano tutte le altre risposte.
Suggerisco di utilizzare una libreria python come netifaces appositamente progettata 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 che è in uso.
default_inf = netifaces.gateways()['default'][netifaces.AF_INET][1]
ip addr|awk '/eth0/ && /inet/ {gsub(/\/[0-9][0-9]/,""); print }'
Utilizza solo ip addr
che sostituisce ifconfig
e awk
combinato con la sostituzione (gsub).
Solo un'altra opzione che può essere utile se non si dispone di awk (come nel caso di alcuni dispositivi incorporati):
ip addr show dev eth0 scope global | grep "inet\b" | cut -d/ -f 1 | egrep -o "([[:digit:]]{1,3}[.]{1}){3}[[:digit:]]{1,3}"
Eccone una buona, 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
ifconfig eth0|grep 'inet '|awk '{print }'
ecco per IPv4 :
ip -f inet a|grep -oP "(?<=inet ).+(?=\/)"
qui per IPv4 & amp; particolare dev (eth0):
ip -f inet a show eth0|grep -oP "(?<=inet ).+(?=\/)"
per IPv6 :
ip -6 -o a|grep -oP "(?<=inet6 ).+(?=\/)"
può essere usato anche con un utente normale.
ip addr show eth0 | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
Questo è il modo più breve che ho trovato:
ip -f inet addr show | grep -Po 'inet \K[\d.]+'
Sostituisci con la tua interfaccia di rete.
ip -f inet
dice a ip di restituire solo i valori per la famiglia inet (ipv4).
grep -Po
dice a grep di interpretare il valore successivo come un perl-regex e stampa solo i valori corrispondenti.
L'espressione regolare \K[\d.]+
dice "butta via tutto fino a questo punto (\ K), e combina quanti più valori numerici seguiti da un punto in una riga il più possibile". Pertanto, corrisponderà solo all'indirizzo IP e ignorerà tutto dopo di esso, inclusa la maschera di sottorete \ XX in forma abbreviata.
in questi giorni con interfacce multiple (ad esempio se usi una finestra mobile) e l'interfaccia di denominazione da parte di ETH non è più la norma
Uso questo comando per estrarre IP / Mask:
IPMASK=$(ip a s|grep -A8 -m1 MULTICAST|grep -m1 inet|cut -d' ' -f6)
Quindi qualunque sia il numero di interfacce che avrò e qualunque sia il loro nome, GREP catturerà 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 amp; NIX non fallisce mai;)
Nel mio script 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.