Risposte:
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
grep "inet"
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)
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.
ip addr show label 'enp*'
più, ma sto analizzando noioso, qualcosa di simile ip addr show label 'enp*' | grep -oP inet\ \\S+ | cut -d' ' -f2
può funzionare ... che bello
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 }'
-o
sta per --oneline
, che è pensato per aiutare esattamente in questo tipo di situazioni. La -4
si aggiunge al limite l'indirizzo IPv4, che è quello che tutti gli altri risposte implicano.
ip
bandiere. Usando cut
piuttosto che la awk
magia avanzata :ip -o -4 addr show eth0 scope global | awk '{print $4;}' | cut -d/ -f 1
cut
molto dopo aver appreso awk
e mi piace ridurre al minimo il numero di comandi sulle mie pipeline. Bel suggerimento in ogni caso.
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.
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 ip
sarebbe il mio approccio preferito, non è certamente l'unico modo per scuoiare questo gatto. Ecco un altro approccio che utilizza hostname
se 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
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]
ip addr|awk '/eth0/ && /inet/ {gsub(/\/[0-9][0-9]/,""); print $2}'
Questo uso ip addr
è solo una sostituzione ifconfig
e una awk
combinazione con la sostituzione (gsub).
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}"
ifconfig eth0|grep 'inet '|awk '{print $2}'
questo può essere utilizzato anche con un utente normale.
ip addr show eth0 | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
ip addr show | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
cut
due volte invece di una combinazione di awk
e cut
per 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.
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.
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;)
ip
, usa l' -o
opzione.
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.