Come ottenere l'indirizzo IP primario del computer locale su Linux e OS X? [chiuso]


339

Sto cercando una soluzione da riga di comando che mi restituisca l'indirizzo IP primario (primo) dell'host locale, diverso da 127.0.0.1

La soluzione dovrebbe funzionare almeno per Linux (Debian e RedHat) e OS X 10.7+

Sono consapevole che ifconfigè disponibile su entrambi ma il suo output non è così coerente tra queste piattaforme.


2
Vuoi solo l'IP di rete locale della tua macchina? ovvero 192.168.0.12
Chris Seymour,

Sì, l'IP locale, prima di tutto perché può avere più di uno, ma potrei vivere anche con un elenco. Per il momento sono felice di supportare solo gli indirizzi IPv4 e di ignorare IPv6, poiché lo voglio solo per generare un hash.
sorin,

2
Come si definisce "primario"? Se stai pensando "l'indirizzo IP che si trova sulla stessa sottorete della mia route predefinita", dovrai programmare un po 'per quello. Ma cosa succede se la macchina non ha un percorso predefinito, ma ha ancora> 1 indirizzi IP?
ghoti,

4
Prova curl -4 ifconfig.co. Risponderà con il tuo indirizzo IP4 esterno.
asmaier,

Risposte:


475

Utilizzare grepper filtrare l'indirizzo IP da ifconfig:

ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'

O con sed:

ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'

Se sei interessato solo a determinate interfacce, wlan0, eth0, ecc., Allora:

ifconfig wlan0 | ...

Puoi alias il comando nel tuo .bashrcper creare il tuo comando chiamato myipad esempio.

alias myip="ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'"

Un modo molto più semplice è hostname -I( hostname -iper le versioni precedenti di hostnamema vedere i commenti). Tuttavia, questo è solo su Linux.


5
Si noti inoltre che in OSX sed utilizza l' -Eopzione per Extended RE, non l' -ropzione in stile GNU .
ghoti,

1
Interessante; Non mi rendevo conto che GNU sed era supportato -E. Le versioni recenti di FreeBSD hanno aggiunto l' -ropzione come alias per -Efacilitare la portabilità degli script, ma l'aggiornamento non è ancora stato portato su OSX, che per ultimo ho controllato utilizza ancora una versione di sed da una versione di FreeBSD di alcuni anni fa. Non sono sicuro di quale, visto che OSX ha adottato il codice sorgente di FreeBSD più volte nel corso degli anni. Credo che l'uso di -Edoveva essere paragonabile a grep's -Eopzione. Non ho idea del perché -rinvece la gente di GNU abbia optato per .
ghoti,

1
@ghoti Ho cambiato la risposta per usare -Eper essere sicuro della portabilità, penseresti che --helpe man pagessarebbe stato aggiornato .. mi ha causato una leggera confusione in precedenza in un'altra domanda usando-E
Chris Seymour il

1
Ho riscontrato un problema, mentre funziona su OS X restituisce più di un IP, un elenco di IP. Sembra che il primo sia quello giusto, ma ciò spezzerebbe la mia logica. Vedi gist.github.com/ssbarnea/31b9dcb0f8fd528b958c - restituisce anche quelli vnic attivi ma usati dai paralleli.
sorin,

13
OSX: ipconfig getifaddr en0
parleer

234

Di seguito funzionerà su Linux ma non su OSX.

Questo non si basa affatto sul DNS e funziona anche se /etc/hostsnon è impostato correttamente ( 1è una scorciatoia per 1.0.0.0):

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

o evitando awke usando il DNS pubblico di Google all'indirizzo 8.8.8.8per ovvietà:

ip route get 8.8.8.8 | head -1 | cut -d' ' -f8

Un modo meno affidabile: (vedi commento sotto)

hostname -I | cut -d' ' -f1

8
Il metodo che ottiene il primo indirizzo prodotto dal hostname -Inon è affidabile, perché (secondo la documentazione) non si possono fare ipotesi sull'ordine degli indirizzi. Quindi potrebbe trattarsi di una rete interna (come la rete su cui vivono le macchine virtuali). L'altro metodo sembra buono.
Adam Ryczkowski,

3
Questa dovrebbe essere la risposta accettata poiché RHEL 7 non include più ifconfig.
Andrew,

10
Per me ip route get 1 | awk '{print $(NF-2);exit}'funziona come mi viene aggiunto al risultato
Hritik,

13
QUESTA (la prima) È L'UNICA SOLUZIONE CORRETTA . È importante leggere l'IP in modo specifico dall'interfaccia associata alla route predefinita. Altrimenti è molto probabile che tu abbia qualche indirizzo interno senza valore.
Jan Hudec,

12
non ha funzionato per me ma era abbastanza chiuso:ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p'
estani,

229

Per macchine linux (non OS X):

hostname --ip-address

10
Funziona solo se il nome è in DNS. In caso contrario, viene visualizzato il messaggio "nome host: nome o servizio non conosciuti".
Vebjorn Ljosa,

39
hostname -iè la forma abbreviata equivalente
Paul Evans,

75
Questo a volte restituirà semplicemente 127.0.0.1. Se disponibile, utilizzare meglio il nome host -I come raccomandato dal manuale (Ubuntu): "--ip-address Visualizza gli indirizzi di rete del nome host. Si noti che funziona solo se il nome host può essere risolto. Evitare di utilizzare questa opzione; usa invece hostname --all-ip-address. "
jrierab,

1
Non funziona neanche su Linux, almeno con hostnameGNU Coreutils versione 8.26.
Ack

5
Sulla mia macchina, hostname -ifornisce solo l'IP locale, mentre hostname -Ifornisce tutti gli altri IP
Alexis Paques,

61

su Linux

hostname -I

su macOS

ipconfig getifaddr en0

hostname -Ipuò restituire più indirizzi in un ordine inaffidabile (vedi la hostnamemanpage ), ma per me ritorna 192.168.1.X, ed è quello che volevi.


1
per me era hostname -icon un I. inferiore
Paul Woitaschek,

2
@PaulWoitaschek la pagina di manuale per la minuscola -ibandiera dice: Avoid using this option; use hostname -I instead.
Boris,

@Boris se stai correndo in qualcosa come un container docker che esegue Alpine (e quindi BusyBox) accetterà solo
lettere

41

Soluzione

$ ip -o route get to 8.8.8.8 | sed -n 's/.*src \([0-9.]\+\).*/\1/p'
192.168.8.16

Spiegazione

Il modo corretto di interrogare le informazioni di rete sta usando ip:

  • -o uscita a una riga
  • route get to ottenere l'attuale percorso del kernel verso una destinazione
  • 8.8.8.8 IP di Google, ma puoi utilizzare l'IP reale che desideri raggiungere

ad es. ipuscita:

8.8.8.8 via 192.168.8.254 dev enp0s25 src 192.168.8.16 uid 1000 \   cache

Per estrarre l' srcip, sedè il più piccolo e compatibile con il supporto regex:

  • -n nessun output di default
  • 's/pattern/replacement/p' corrisponde solo al motivo e alla sostituzione di stampa
  • .*src \([0-9.]\+\).* per raggiungere l'IP src utilizzato dal kernel 8.8.8.8

ad es. uscita finale:

192.168.8.16

Altre risposte

Penso che nessuna delle risposte precedenti sia abbastanza buona per me, poiché non funzionano in una macchina recente (Gentoo 2018).

Problemi che ho riscontrato con le risposte precedenti:

  • uso della colonna posizionale nell'output del comando;
  • il cui utilizzo ifconfigè deprecato e - ad esempio - non elencare IP multipli;
  • uso di awkper un compito semplice che sed può gestire meglio;
  • ip route get 1 non è chiaro ed è in realtà un alias per ip route get to 1.0.0.0
  • uso del hostnamecomando, che non ha -Iopzione in tutti gli apparecchi e che ritorna 127.0.0.1nel mio caso.

34

Modificato ( 2014-06-01 2018-01-09)

Per una configurazione più forte, con molte interfacce e molti IP configurati su ciascuna interfaccia, ho scritto uno script bash puro (non basato su 127.0.0.1) per trovare l'interfaccia e l' IP corretti , basati su default route. Pubblico questo script in fondo a questa risposta.

Intro

Come hanno fatto entrambi gli Os installato di default, esiste un suggerimento bash sia per Mac che per Linux:

Il problema della localizzazione è impedito dall'uso di LANG=C:

myip=
while IFS=$': \t' read -a line ;do
    [ -z "${line%inet}" ] && ip=${line[${#line[1]}>4?1:2]} &&
        [ "${ip#127.0.0.1}" ] && myip=$ip
  done< <(LANG=C /sbin/ifconfig)
echo $myip

Mettendo questo in una funzione:

Minimo:

getMyIP() {
    local _ip _line
    while IFS=$': \t' read -a _line ;do
        [ -z "${_line%inet}" ] &&
           _ip=${_line[${#_line[1]}>4?1:2]} &&
           [ "${_ip#127.0.0.1}" ] && echo $_ip && return 0
      done< <(LANG=C /sbin/ifconfig)
}

Uso semplice:

getMyIP
192.168.1.37

Fantasia ordinata:

getMyIP() {
    local _ip _myip _line _nl=$'\n'
    while IFS=$': \t' read -a _line ;do
        [ -z "${_line%inet}" ] &&
           _ip=${_line[${#_line[1]}>4?1:2]} &&
           [ "${_ip#127.0.0.1}" ] && _myip=$_ip
      done< <(LANG=C /sbin/ifconfig)
    printf ${1+-v} $1 "%s${_nl:0:$[${#1}>0?0:1]}" $_myip
}

Uso:

getMyIP
192.168.1.37

oppure, eseguendo la stessa funzione, ma con un argomento:

getMyIP varHostIP
echo $varHostIP
192.168.1.37
set | grep ^varHostIP
varHostIP=192.168.1.37

Nota: Senza argomento, questa funzione viene emessa su STDOUT, l'IP e una newline , con un argomento, non viene stampato nulla, ma viene creata una variabile denominata come argomento e contiene IP senza newline .

Nota2: Questo è stato testato su Debian, LaCie hackerato nas e MaxOs. Se questo non funziona nel tuo ambiente, sarei molto interessato dai feedback!

Versione precedente di questa risposta

(Non cancellato perché basato su sed, non bash.)

Avvertenza: c'è un problema con le versioni locali!

Veloce e piccolo:

myIP=$(ip a s|sed -ne '/127.0.0.1/!{s/^[ \t]*inet[ \t]*\([0-9.]\+\)\/.*$/\1/p}')

Esploso (funziona anche;)

myIP=$(
    ip a s |
    sed -ne '
        /127.0.0.1/!{
            s/^[ \t]*inet[ \t]*\([0-9.]\+\)\/.*$/\1/p
        }
    '
)

Modificare:

Come! Questo sembra non funzionare su Mac OS ...

Ok, questo sembra funzionare allo stesso modo su Mac OS come sul mio Linux :

myIP=$(LANG=C /sbin/ifconfig  | sed -ne $'/127.0.0.1/ ! { s/^[ \t]*inet[ \t]\\{1,99\\}\\(addr:\\)\\{0,1\\}\\([0-9.]*\\)[ \t\/].*$/\\2/p; }')

diviso:

myIP=$(
    LANG=C /sbin/ifconfig  |
        sed -ne $'/127.0.0.1/ ! {
            s/^[ \t]*inet[ \t]\\{1,99\\}\\(addr:\\)\\{0,1\\}\\([0-9.]*\\)[ \t\/].*$/\\2/p;
        }')

La mia sceneggiatura (gennaio 2018):

Questo script trova prima il percorso e l' interfaccia predefiniti utilizzati, quindi cerca la rete di corrispondenza ip locale del gateway e popola le variabili. Le ultime due righe sono appena stampate, qualcosa del tipo:

Interface   : en0
Local Ip    : 10.2.5.3
Gateway     : 10.2.4.204
Net mask    : 255.255.252.0
Run on mac  : true

o

Interface   : eth2
Local Ip    : 192.168.1.31
Gateway     : 192.168.1.1
Net mask    : 255.255.255.0
Run on mac  : false

Bene, eccolo qui:

#!/bin/bash
runOnMac=false
int2ip() { printf ${2+-v} $2 "%d.%d.%d.%d" \
        $(($1>>24)) $(($1>>16&255)) $(($1>>8&255)) $(($1&255)) ;}
ip2int() { local _a=(${1//./ }) ; printf ${2+-v} $2 "%u" $(( _a<<24 |
                  ${_a[1]} << 16 | ${_a[2]} << 8 | ${_a[3]} )) ;}
while IFS=$' :\t\r\n' read a b c d; do
    [ "$a" = "usage" ] && [ "$b" = "route" ] && runOnMac=true
    if $runOnMac ;then
        case $a in 
            gateway )    gWay=$b  ;;
            interface )  iFace=$b ;;
        esac
    else
        [ "$a" = "0.0.0.0" ] && [ "$c" = "$a" ] && iFace=${d##* } gWay=$b
    fi
done < <(/sbin/route -n 2>&1 || /sbin/route -n get 0.0.0.0/0)
ip2int $gWay gw
while read lhs rhs; do
    [ "$lhs" ] && { 
        [ -z "${lhs#*:}" ] && iface=${lhs%:}
        [ "$lhs" = "inet" ] && [ "$iface" = "$iFace" ] && {
            mask=${rhs#*netmask }
            mask=${mask%% *}
            [ "$mask" ] && [ -z "${mask%0x*}" ] &&
                printf -v mask %u $mask ||
                ip2int $mask mask
            ip2int ${rhs%% *} ip
            (( ( ip & mask ) == ( gw & mask ) )) &&
                int2ip $ip myIp && int2ip $mask netMask
        }
    }
done < <(/sbin/ifconfig)
printf "%-12s: %s\n" Interface $iFace Local\ Ip $myIp \
       Gateway $gWay Net\ mask $netMask Run\ on\ mac $runOnMac

1
@sorin: sì, ora funziona con ifconfig. (come sbinnon è il mio percorso $PATHcompleto deve essere specificato, ma lo stesso percorso esiste anche su MacOS. :-)
F. Hauri

1
@sorin prova con questo timeper selezionare quale useresti così a lungo ...
F. Hauri,

la soluzione rapida e piccola era l'approccio migliore. Le soluzioni più recenti mi danno errori di sintassi. La compatibilità è sempre un vantaggio. Grazie.
m3nda,

28

Specifico solo per alcune build di Ubuntu. Anche se potrebbe solo dirti 127.0.0.1:

hostname  -i

o

hostname -I

funziona in ogni caso?
AloneInTheDark,

6
no. - potrebbe semplicemente dirti 127.0.0.1.
SvenDowideit,

hostname -Io funziona su Ubuntu.
Borzh,

1
$ hostname --ip-addressmi dà solo 127.0.0.1su Arch Linux
kristianlm l'

1
usa hostname -Io hostname --all-ip-address
Aydin K.

24

Puoi anche ottenere l'indirizzo IP versione 4 di eth0 usando questo comando in linux

/sbin/ip -4 -o addr show dev eth0| awk '{split($4,a,"/");print a[1]}'

L'output sarà così

[root@localhost Sathish]# /sbin/ip -4 -o addr show dev eth0| awk '{split($4,a,"/");print a[1]}'
192.168.1.22

La migliore risposta per me! Grazie @Sathish! ;-)
Samuel Phan il

1
Sono d'accordo, questo è il metodo più pulito per ottenere l'IPv4 di eth0.
Chris Mendez,

Ciò presuppone eth0, che non è l'attuale strategia di denominazione e che non è mai stata garantita come interfaccia principale.
rfay,

Questo è il metodo più elegante se conosci l'interfaccia. Ideale se il tuo sistema ha più interfacce ma sei solo interessato a una particolare.
lepe,

14

Funziona su Linux e OSX

Ciò otterrà l'interfaccia associata al percorso predefinito

NET_IF=`netstat -rn | awk '/^0.0.0.0/ {thif=substr($0,74,10); print thif;} /^default.*UG/ {thif=substr($0,65,10); print thif;}'`

Utilizzando l'interfaccia scoperta sopra, ottenere l'indirizzo IP.

NET_IP=`ifconfig ${NET_IF} | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'`

OSX

uname -a

Darwin laptop 14.4.0 Darwin Kernel Versione 14.4.0: gio 28 maggio 11:35:04 PDT 2015; root: xnu-2782.30.5 ~ 1 / RELEASE_X86_64 x86_64

echo $NET_IF

EN5

echo $NET_IP

192.168.0.130

CentOS Linux

uname -a

Linux dev-cil.medfx.local 2.6.18-164.el5xen 1 SMP gio 3 set 04:03:03 EDT 2009 x86_64 x86_64 x86_64 GNU / Linux

echo $NET_IF

eth0

echo $NET_IP

192.168.46.10


Nonostante tutte le risposte a questa domanda, questa sembra essere l'unica che si avvicina alla verità. Ha solo bisogno di un | head -1alla fine della prima riga per ottenere l'interfaccia predefinita, e il resto è buono.
Endareth,

12

Utilizzo di alcuni degli altri metodi È possibile che si verifichi un conflitto in cui sul sistema sono definiti più indirizzi IP. Questa riga ottiene sempre l'indirizzo IP per impostazione predefinita utilizzato.

ip route get 8.8.8.8 | head -1 | awk '{print $7}'

Non funzionerà se non esiste un percorso predefinito (ma una buona idea)
FractalSpace

Bello ... Supponi di lavorare anche se non hai Internet?
Boris Churzin il

8

Sto estraendo il mio commento a questa risposta:

ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p'

Si basa sulla risposta di @CollinAnderson che non ha funzionato nel mio caso.


8
ifconfig | grep 'inet ' | grep -v '127.0.0.1' | awk '{print $2}'

1
Se stai cercando di trasformare questo in un bashalias:alias myip="ifconfig | grep 'inet ' | grep -v '127.0.0.1' | awk '{print \$2}'"
Sam Houston

Destra. Ma la domanda inizialmente riguardava il comando. Quindi ho appena pubblicato in modo pertinente. Saluti!
Faizan Noor,

6

Il modo più breve per ottenere il tuo indirizzo ipv4 locale sul tuo sistema linux:

hostname -I | awk '{print $1}'

5
Male. La pagina man ti dice specificamente di non fare ipotesi sull'ordine dell'output.
Matt,

Funziona benissimo per i miei banali casi d'uso - non mi importa se è veloce e sporco! Grande!
Nicolai Weitkemper,

6

Supponendo che tu abbia bisogno del tuo IP pubblico primario come visto dal resto del mondo, prova uno di questi:

wget http://ipecho.net/plain -O - -q
curl http://icanhazip.com
curl http://ifconfig.me/ip

6

Devo aggiungere alla risposta di Collin Anderson che questo metodo tiene conto anche se si hanno due interfacce e sono entrambe mostrate in alto.

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

Ho lavorato su un'applicazione con Raspberry Pi e avevo bisogno dell'indirizzo IP che veniva effettivamente utilizzato non solo se era attivo o meno. La maggior parte delle altre risposte restituirà entrambi gli indirizzi IP che non sono necessariamente utili - per il mio scenario comunque.


5

IP dell'interfaccia di rete primaria

ifconfig `ip route | grep default | head -1 | sed 's/\(.*dev \)\([a-z0-9]*\)\(.*\)/\2/g'` | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" | head -1

5

Trova un indirizzo IP di questo computer in una rete che è un gateway predefinito (ad esempio esclude tutte le reti virtuali, i docker bridge) ad es. gateway internet, gateway wifi, ethernet

ip route| grep $(ip route |grep default | awk '{ print $5 }') | grep -v "default" | awk '/scope/ { print $9 }'

Funziona su Linux.

Test:

  ~ ip route| grep $(ip route |grep default | awk '{ print $5 }') | grep -v "default" | awk '/scope/ { print $9 }'
192.168.0.114

  reverse-networking git:(feature/type-local)  ifconfig wlp2s0
wlp2s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.114  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::d3b9:8e6e:caee:444  prefixlen 64  scopeid 0x20<link>
        ether ac:x:y:z  txqueuelen 1000  (Ethernet)
        RX packets 25883684  bytes 27620415278 (25.7 GiB)
        RX errors 0  dropped 27  overruns 0  frame 0
        TX packets 7511319  bytes 1077539831 (1.0 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Bello! La migliore programmazione di Taco Bell - grazie per questo.
Stevie Howard,

3
ip addr show | grep -E '^\s*inet' | grep -m1 global | awk '{ print $2 }' | sed 's|/.*||'

3

Un'altra ifconfigvariante che funziona sia su Linux che su OSX:

ifconfig | grep "inet " | cut -f2 -d' '

1
una piccola variazione:ifconfig | grep '\<inet\>' | cut -d ' ' -f2 | grep -v '127.0.0.1'
jpbochi il

Perché la metà di queste risposte non funziona affatto per me?
SurpriseDog

3

Ho attraversato molti collegamenti (StackExchange, AskUbuntu, StackOverflow ecc.) E sono arrivato alla decisione di combinare tutte le migliori soluzioni in uno script di shell.

A mio avviso, questi due QA sono i migliori in assoluto:

Come posso ottenere il mio indirizzo IP esterno in uno script di shell? https://unix.stackexchange.com/q/22615

Come trovo il mio indirizzo IP interno? https://askubuntu.com/a/604691

Ecco la mia soluzione basata su alcune idee di rsp condivise nel suo repository ( https://github.com/rsp/scripts/ ).

Alcuni di voi potrebbero dire che questo script è estremamente grande per un compito così semplice, ma mi piacerebbe renderlo il più semplice e flessibile possibile. Supporta un semplice file di configurazione che consente di ridefinire i valori predefiniti.

È stato testato con successo su Cygwin, MINGW e Linux (Red Hat).

Mostra indirizzo IP interno

myip -i

Mostra indirizzo IP esterno

myip -e

Codice sorgente, disponibile anche tramite il link: https://github.com/ildar-shaimordanov/tea-set/blob/master/home/bin/myip . C'è un esempio di file di configurazione, accanto allo script principale.

#!/bin/bash

# =========================================================================
#
# Getting both internal and external IP addresses used for outgoing 
# Internet connections.
#
# Internal IP address is the IP address of your computer network interface 
# that would be used to connect to Internet.
#
# External IP address is the IP address that is visible by external 
# servers that you connect to over Internet.
#
# Copyright (C) 2016 Ildar Shaimordanov
#
# =========================================================================

# Details of the actual implementation are based on the following QA:
#
# How can I get my external IP address in a shell script?
# https://unix.stackexchange.com/q/22615
#
# How do I find my internal ip address?
# https://askubuntu.com/a/604691

# =========================================================================

for f in \
    "$( dirname "$0" )/myip.conf" \
    ~/.myip.conf \
    /etc/myip.conf
do
    [ -f "$f" ] && {
        . "$f"
        break
    }
done

# =========================================================================

show_usage() {
    cat - <<HELP
USAGE
  $( basename "$0" ) [OPTIONS]

DESCRIPTION
  Display the internal and external IP addresses

OPTIONS
  -i  Display the internal IP address
  -e  Display the external IP address
  -v  Turn on verbosity
  -h  Print this help and exit
HELP
    exit
}

die() {
    echo "$( basename "$0" ): $@" >&2
    exit 2
}

# =========================================================================

show_internal=""
show_external=""
show_verbose=""

while getopts ":ievh" opt
do
    case "$opt" in
    i )
        show_internal=1
        ;;
    e )
        show_external=1
        ;;
    v )
        show_verbose=1
        ;;
    h )
        show_usage
        ;;
    \? )
        die "Illegal option: $OPTARG"
        ;;
    esac
done

if [ -z "$show_internal" -a -z "$show_external" ]
then
    show_internal=1
    show_external=1
fi

# =========================================================================

# Use Google's public DNS to resolve the internal IP address
[ -n "$TARGETADDR" ] || TARGETADDR="8.8.8.8"

# Query the specific URL to resolve the external IP address
[ -n "$IPURL" ] || IPURL="ipecho.net/plain"

# Define explicitly $IPCMD to gather $IPURL using another tool
[ -n "$IPCMD" ] || {
    if   which curl >/dev/null 2>&1
    then
        IPCMD="curl -s"
    elif which wget >/dev/null 2>&1
    then
        IPCMD="wget -qO -"
    else
        die "Neither curl nor wget installed"
    fi
}

# =========================================================================

resolveip() {
    {
        gethostip -d "$1" && return
        getent ahostsv4 "$1" \
        | grep RAW \
        | awk '{ print $1; exit }' 
    } 2>/dev/null
}

internalip() {
    [ -n "$show_verbose" ] && printf "Internal: "

    case "$( uname | tr '[:upper:]' '[:lower:]' )" in
    cygwin* | mingw* | msys* )
        netstat -rn \
        | grep -w '0.0.0.0' \
        | awk '{ print $4 }'
        return
        ;;
    esac

    local t="$( resolveip "$TARGETADDR" )"
    [ -n "$t" ] || die "Cannot resolve $TARGETADDR"
    ip route get "$t" \
    | awk '{ print $NF; exit }'
}

externalip() {
    [ -n "$show_verbose" ] && printf "External: "

    eval $IPCMD "$IPURL" $IPOPEN
}

# =========================================================================

[ -n "$show_internal" ] && internalip
[ -n "$show_external" ] && externalip

# =========================================================================

# EOF

3

Uso solo i nomi delle interfacce di rete , il mio comando personalizzato è

[[ $(ip addr | grep enp0s25) != '' ]] && ip addr show dev enp0s25 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p' 

nel mio taccuino

[flying@lempstacker ~]$ cat /etc/redhat-release 
CentOS Linux release 7.2.1511 (Core) 
[flying@lempstacker ~]$ [[ $(ip addr | grep enp0s25) != '' ]] && ip addr show dev enp0s25 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p'
192.168.2.221
[flying@lempstacker ~]$

ma se l'interfaccia di rete possiede almeno un ip, mostrerà che tutti gli ip appartengono ad esso

per esempio

Ubuntu 16.10

root@yakkety:~# sed -r -n 's@"@@g;s@^VERSION=(.*)@\1@p' /etc/os-release
16.04.1 LTS (Xenial Xerus)
root@yakkety:~# [[ $(ip addr | grep enp0s25) != '' ]] && ip addr show dev enp0s25 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p'
178.62.236.250
root@yakkety:~#

Debian Jessie

root@jessie:~# sed -r -n 's@"@@g;s@^PRETTY_NAME=(.*)@\1@p' /etc/os-release
Debian GNU/Linux 8 (jessie)
root@jessie:~# [[ $(ip addr | grep enp0s25) != '' ]] && ip addr show dev enp0s25 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p'
192.81.222.54
root@jessie:~# 

CentOS 6.8

[root@centos68 ~]# cat /etc/redhat-release 
CentOS release 6.8 (Final)
[root@centos68 ~]# [[ $(ip addr | grep enp0s25) != '' ]] && ip addr show dev enp0s25 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p'
162.243.17.224
10.13.0.5
[root@centos68 ~]# ip route get 1 | awk '{print $NF;exit}'
162.243.17.224
[root@centos68 ~]#

Fedora 24

[root@fedora24 ~]# cat /etc/redhat-release 
Fedora release 24 (Twenty Four)
[root@fedora24 ~]# [[ $(ip addr | grep enp0s25) != '' ]] && ip addr show dev enp0s25 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p'
104.131.54.185
10.17.0.5
[root@fedora24 ~]# ip route get 1 | awk '{print $NF;exit}'
104.131.54.185
[root@fedora24 ~]#

Sembra che quel comando ip route get 1 | awk '{print $NF;exit}'fornito da link sia più accurato, per di più, più breve.


2

Non sono sicuro che funzioni in tutti i sistemi operativi, provalo.

ifconfig | awk -F"[ :]+" '/inet addr/ && !/127.0/ {print $4}'

Non funziona su CentOS 7.0
Benoit Blanchon,

@BenoitBlanchon Quindi usa questo ip route get 1 | awk '{print $NF;exit}'. Dovrebbe funzionare sulla maggior parte del sistema.
Jotne,

Infatti ip route get 1 | awk '{print $NF;exit}'funziona
Benoit Blanchon

2

C'è un pacchetto di nodi per tutto. È multipiattaforma e facile da usare.

$ npm install --global internal-ip-cli

$ internal-ip
fe80::1

$ internal-ip --ipv4
192.168.0.3

Questo è un approccio controverso, ma l'utilizzo di npm per gli strumenti sta diventando sempre più popolare, piaccia o no.


1

Se conosci l'interfaccia di rete (eth0, wlan, tun0 ecc.):

ifconfig eth0 | grep addr: | awk '{ print $2 }' | cut -d: -f2

1
ifconfig | grep "inet addr:" | grep -v "127.0.0.1" | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'  | head -1

non funziona su macOS 10.12.6
Antoine F.

1
ifconfig $(netstat -rn | grep -E "^default|^0.0.0.0" | head -1 | awk '{print $NF}') | grep 'inet ' | awk '{print $2}' | grep -Eo '([0-9]*\.){3}[0-9]*' 

1

Funziona su Mac, Linux e all'interno dei Docker Container:

$ hostname --ip-address 2> /dev/null || (ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p' | awk '{print$ 1; Uscita}')

Funziona anche Makefilecome:

LOCAL_HOST := ${shell hostname --ip-address 2> /dev/null || (ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p' | awk '{print $1; exit}')}


Mac non funziona: hostname --ip-address=> hostname: illegal option -- -su macOS Sierra
JL Peyret,

1

Per Linux, ciò di cui hai bisogno è questo comando:

ifconfig $1|sed -n 2p|awk '{ print $2 }'|awk -F : '{ print $2 }'

digita questo nella tua shell e conoscerai semplicemente il tuo IP.


No. Non funziona.
FractalSpace,

1

Questo è più facile da leggere: ifconfig | grep 'inet addr:' |/usr/bin/awk '{print $2}' | tr -d addr:


non funziona su macOS 10.12.6
Antoine F.

1

Se hai npme nodeinstallato:npm install -g ip && node -e "const ip = require('ip'); console.log(ip.address())"

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.