¿Cómo obtener la dirección IP principal de la máquina local en Linux y OS X? [cerrado]

338

Estoy buscando una solución de línea de comando que me devuelva la dirección IP principal (primera) del localhost, que no sea 127.0.0.1

La solución debería funcionar al menos para Linux (Debian y RedHat) y OS X 10.7+

Soy consciente de que ifconfigestá disponible en ambos, pero su salida no es tan consistente entre estas plataformas.

sorin
fuente
2
¿Solo quiere la IP de la red local de su máquina? es decir, 192.168.0.12
Chris Seymour
Sí, la IP local, la primera de ellas, ya que puede tener más de una, pero podría vivir incluso con una lista. Por el momento, me complace admitir solo las direcciones IPv4 e ignorar el IPv6, ya que solo quiero generar un hash.
sorin
2
¿Cómo se define "primario"? Si está pensando "la dirección IP que está en la misma subred que mi ruta predeterminada", necesitará programar un poco para eso. Pero, ¿qué pasa si la máquina no tiene una ruta predeterminada, pero todavía tiene> 1 direcciones IP?
ghoti
44
Tratar curl -4 ifconfig.co. Contestará con su dirección IP4 externa.
asmaier

Respuestas:

475

Use greppara filtrar la dirección IP de 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'

Si solo está interesado en ciertas interfaces, wlan0, eth0, etc., entonces:

ifconfig wlan0 | ...

Puede alias el comando en su .bashrcpara crear su propio comando llamado, myippor ejemplo.

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

Una forma mucho más simple es hostname -I( hostname -ipara versiones anteriores de hostnamepero ver comentarios). Sin embargo, esto es solo en Linux.

Chris Seymour
fuente
55
Tenga en cuenta también que en OSX, sed usa la -Eopción para RE extendido, no la -ropción de estilo GNU .
ghoti
1
Interesante; No me di cuenta de que GNU estaba soportado -E. Las versiones recientes de FreeBSD han agregado la -ropción como un alias para -Efacilitar la portabilidad del script, pero la actualización aún no se ha llevado a OSX, que la última vez que revisé todavía usa una versión de sed de una versión de FreeBSD de hace unos años. No estoy seguro exactamente cuál, ya que OSX ha adoptado el código fuente de FreeBSD varias veces a lo largo de los años. Creo que el uso de -Eestaba destinado a ser comparable a grepla -Eopción de. No tengo idea de por qué la gente de GNU optó por ella -r.
ghoti
1
@ghoti he cambiado de respuesta que se usa -Epara asegurarse de portabilidad, se podría pensar que --helpy man pagesse actualizarían .. sí causó cierta confusión para mí anteriormente en otra pregunta utilizando-E
Chris Seymour
1
Encontré un problema, aunque esto funciona en OS X, devuelve más de una IP, una lista de IP. Parece que el primero es el correcto, pero aún así esto rompería mi lógica. Consulte gist.github.com/ssbarnea/31b9dcb0f8fd528b958c ; también devuelve los vnic que están activos pero utilizados por paralles.
sorin
13
OSX: ipconfig getifaddr en0
parleer
232

Lo siguiente funcionará en Linux pero no en OSX.

Esto no depende del DNS en absoluto, y funciona incluso si /etc/hostsno está configurado correctamente ( 1es la abreviatura de 1.0.0.0):

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

o evitando awky usando el DNS público de Google en 8.8.8.8obvio:

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

Una forma menos confiable: (ver comentario más abajo)

hostname -I | cut -d' ' -f1
Collin Anderson
fuente
8
El método que obtiene la primera dirección producida por el hostname -Ino es confiable, porque (de acuerdo con la documentación) no se pueden hacer suposiciones sobre el orden de las direcciones. Por lo tanto, puede ser una red interna (como la red en la que viven las máquinas virtuales). El otro método parece bueno.
Adam Ryczkowski el
3
Esta debería ser la respuesta aceptada ya que RHEL 7 ya no incluye ifconfig.
Andrew
10
Para mí ip route get 1 | awk '{print $(NF-2);exit}'funciona mientras me añaden a la salida
Hritik
13
ESTA (la primera) ES LA ÚNICA SOLUCIÓN CORRECTA . Es importante leer la IP específicamente desde la interfaz asociada con la ruta predeterminada. De lo contrario, es muy probable que obtenga una dirección interna sin valor.
Jan Hudec
12
no funcionó para mí pero estaba lo suficientemente cerrado:ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p'
estani
230

Para máquinas Linux (no OS X):

hostname --ip-address
Acíclico
fuente
10
Eso solo funciona si el nombre está en DNS. De lo contrario, aparece el mensaje "nombre de host: nombre o servicio desconocido".
Vebjorn Ljosa
39
hostname -ies la forma abreviada equivalente
Paul Evans
75
Esto a veces simplemente devolverá 127.0.0.1. Si está disponible, mejor use hostname -I como lo recomienda el manual (Ubuntu): "--ip-address Muestra las direcciones de red del nombre de host. Tenga en cuenta que esto solo funciona si el nombre de host se puede resolver. Evite usar esta opción; use el nombre de host --todas las direcciones IP en su lugar ".
jrierab
1
Tampoco funciona en Linux, al menos no con hostnameGNU Coreutils versión 8.26.
ack
55
En mi máquina, hostname -isolo da la IP local, mientras que hostname -Ida todas las otras IPs
Alexis Paques
62

en Linux

hostname -I

en macOS

ipconfig getifaddr en0

hostname -Ipuede devolver varias direcciones en un orden poco confiable (vea la página de hostnamemanual ), pero para mí solo regresa 192.168.1.X, que es lo que quería.

Boris
fuente
1
para mí fue hostname -icon un menor I.
Paul Woitaschek
2
@PaulWoitaschek la página de manual para la minúscula -ibandera dice lo siguiente: Avoid using this option; use hostname -I instead.
Boris
@Boris si está ejecutando algo así como un contenedor acoplable que ejecuta Alpine (y, por lo tanto, BusyBox) solo aceptará la bandera minúscula -i
bayetovsky
40

Solución

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

Explicación

La forma correcta de consultar la información de la red es usar ip:

  • -o salida de una línea
  • route get to obtener la ruta real del kernel a un destino
  • 8.8.8.8 IP de Google, pero puede usar la IP real que desea alcanzar

por ejemplo, ipsalida:

8.8.8.8 via 192.168.8.254 dev enp0s25 src 192.168.8.16 uid 1000 \   cache

Para extraer el srcip, sedes el más ligero y más compatible con el soporte de expresiones regulares:

  • -n sin salida por defecto
  • 's/pattern/replacement/p' solo coinciden con el patrón y el reemplazo de impresión
  • .*src \([0-9.]\+\).* coincidir con la IP src utilizada por el núcleo, para alcanzar 8.8.8.8

Por ejemplo, salida final:

192.168.8.16

Otras respuestas

Creo que ninguna de las respuestas anteriores es lo suficientemente buena para mí, ya que no funcionan en una máquina reciente (Gentoo 2018).

Problemas que encontré con las respuestas anteriores:

  • uso de columna posicional en la salida del comando;
  • el uso de los ifconfigcuales está en desuso y, por ejemplo, no enumera las direcciones IP múltiples;
  • uso de awkpara una tarea simple que sed puede manejar mejor;
  • ip route get 1 no está claro, y en realidad es un alias para ip route get to 1.0.0.0
  • uso del hostnamecomando, que no tiene -Iopción en todos los dispositivos y que regresan 127.0.0.1en mi caso.
giosh94mhz
fuente
34

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

Para una configuración más fuerte, con muchas interfaces y muchas IP configuradas en cada interfaz, escribí un script bash puro (no basado en 127.0.0.1) para encontrar la interfaz correcta y la IP, basada en default route. Publico este script al final de esta respuesta.

Introducción

Como ambos os tienen instalado de forma predeterminada, hay una sugerencia bash para Mac y Linux:

El problema de la configuración regional se evita mediante el uso de 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

Poniendo esto en una función:

Mínimo:

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 simple:

getMyIP
192.168.1.37

Elegante ordenado:

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

o, ejecutando la misma función, pero con un argumento:

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

Nota: Sin argumento, esta función sale en STDOUT, la IP y una nueva línea , con un argumento, no se imprime nada, pero se crea una variable llamada argumento y contiene IP sin nueva línea .

Nota2: Esto fue probado en Debian, LaCie hackeó nas y MaxOs. Si esto no funciona en su entorno, ¡me interesarán mucho los comentarios!

Versión anterior de esta respuesta

(No eliminado porque basado en sed, no bash).

Advertir: ¡Hay un problema con las configuraciones regionales!

Rápido y pequeño:

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

Explotado (trabajo también;)

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

Editar:

¡Cómo! Esto parece no funcionar en Mac OS ...

Ok, esto parece funcionar bastante igual en Mac OS que en mi 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; }')

dividido:

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;
        }')

Mi guión (enero de 2018):

Esta secuencia de comandos primero encontrará la ruta y la interfaz predeterminadas utilizadas, luego buscará la red local de coincidencia de IP de la puerta de enlace y completará las variables. Las dos últimas líneas simplemente se imprimen, algo así como:

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

Bueno, ahí está:

#!/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
F. Hauri
fuente
1
@sorin: sí, esto funciona ahora con ifconfig. (como sbinno está en mi $PATHruta completa, tengo que especificarla, pero también existe la misma ruta en MacOS. :-)
F. Hauri
1
@sorin intente esto timepara seleccionar cuál usaría tanto tiempo ...
F. Hauri
La solución rápida y pequeña fue el mejor enfoque. Las soluciones más nuevas me dan errores de sintaxis. La compatibilidad es siempre una ventaja. Gracias.
m3nda
29

Específico solo para ciertas compilaciones de Ubuntu. Aunque puede que solo te diga 127.0.0.1:

hostname  -i

o

hostname -I
usuario3173508
fuente
¿Funciona esto en todos los casos?
AloneInTheDark
66
No. - Puede que solo te diga 127.0.0.1.
SvenDowideit
hostname -I funciona en ubuntu.
Borzh
1
$ hostname --ip-addresssolo me da 127.0.0.1en Arch Linux
kristianlm
1
use hostname -I o hostname --all-ip-address
Aydin K.
24

También puede obtener la dirección IP versión 4 de eth0 utilizando este comando en linux

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

La salida será así

[root@localhost Sathish]# /sbin/ip -4 -o addr show dev eth0| awk '{split($4,a,"/");print a[1]}'
192.168.1.22
Sathish
fuente
¡La mejor respuesta para mí! Gracias @Sathish! ;-)
Samuel Phan
1
Estoy de acuerdo, este es el método más limpio para obtener IPv4 de eth0.
Chris Mendez
Esto supone eth0, que no es una estrategia de nomenclatura actual y nunca se garantizó que fuera la interfaz principal.
rfay
Este es el método más elegante si conoce la interfaz. Ideal si su sistema tiene múltiples interfaces pero solo está interesado en una en particular.
lepe
14

Esto funciona en Linux y OSX

Esto obtendrá la interfaz asociada a la ruta predeterminada

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;}'`

Usando la interfaz descubierta anteriormente, obtenga la dirección 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

Laptop Darwin 14.4.0 Darwin Kernel Versión 14.4.0: jue 28 de mayo 11:35:04 PDT 2015; raíz: 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 jue 3 sep 04:03:03 EDT 2009 x86_64 x86_64 x86_64 GNU / Linux

echo $NET_IF

eth0

echo $NET_IP

192.168.46.10

Colin Fletcher
fuente
A pesar de todas las respuestas a esta pregunta, esta parece ser la única que realmente se acerca a ser correcta. Solo necesita un | head -1al final de la primera línea para obtener la interfaz predeterminada, y el resto es bueno.
Endareth
12

Uso de algunos de los otros métodos Puede entrar en conflicto donde se definen múltiples direcciones IP en el sistema. Esta línea siempre obtiene la dirección IP por defecto utilizada.

ip route get 8.8.8.8 | head -1 | awk '{print $7}'
Kjeld Flarup
fuente
Fallará
Bien ... ¿Supongo que funciona incluso si no tienes internet?
Boris Churzin
8

Extraigo mi comentario a esta respuesta:

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

Se basa en la respuesta de @CollinAnderson que no funcionó en mi caso.

estani
fuente
8
ifconfig | grep 'inet ' | grep -v '127.0.0.1' | awk '{print $2}'
Faizan Noor
fuente
1
Si está buscando convertir esto en un bashalias:alias myip="ifconfig | grep 'inet ' | grep -v '127.0.0.1' | awk '{print \$2}'"
Sam Houston
Derecha. Pero la pregunta inicialmente era sobre el comando. Así que acabo de publicar de manera relevante. ¡Salud!
Faizan Noor
6

La forma más corta de obtener su dirección ipv4 local en su sistema Linux:

hostname -I | awk '{print $1}'
Harry
fuente
55
Malo. La página de manual le dice específicamente que no haga suposiciones sobre el orden de la salida.
Matt
Funciona muy bien para mis casos de uso triviales: ¡no me importa si es rápido y sucio! ¡Excelente!
Nicolai Weitkemper
6

Suponiendo que necesita su IP pública principal como se ve desde el resto del mundo, pruebe cualquiera de los siguientes:

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

Tengo que agregar a la respuesta de Collin Anderson que este método también tiene en cuenta si tiene dos interfaces y ambas aparecen como arriba.

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

He estado trabajando en una aplicación con Raspberry Pi y necesitaba la dirección IP que realmente se estaba utilizando, no solo si estaba activa o no. La mayoría de las otras respuestas devolverán ambas direcciones IP, lo que no es necesariamente útil, para mi escenario de todos modos.

c7borg
fuente
5

IP de interfaz de red 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
kaspars
fuente
5

Encuentra una dirección IP de esta computadora en una red que es una puerta de enlace predeterminada (por ejemplo, excluye todas las redes virtuales, puentes acoplables), por ejemplo. puerta de enlace a internet, puerta de enlace wifi, ethernet

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

Funciona en Linux.

Prueba:

  ~ 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
Krzysztof Wesołowski
fuente
¡Agradable! La mejor programación de Taco Bell : gracias por esto.
Stevie Howard
3
ip addr show | grep -E '^\s*inet' | grep -m1 global | awk '{ print $2 }' | sed 's|/.*||'
rbolante
fuente
3

Otra ifconfigvariante que funciona tanto en Linux como en OSX:

ifconfig | grep "inet " | cut -f2 -d' '
ccpizza
fuente
1
una pequeña variación:ifconfig | grep '\<inet\>' | cut -d ' ' -f2 | grep -v '127.0.0.1'
jpbochi
¿Por qué la mitad de estas respuestas no funcionan para mí?
SurpriseDog
3

Revisé muchos enlaces (StackExchange, AskUbuntu, StackOverflow, etc.) y tomé la decisión de combinar las mejores soluciones en un script de shell.

En mi opinión, estos dos QA son los mejores vistos:

¿Cómo puedo obtener mi dirección IP externa en un script de shell? https://unix.stackexchange.com/q/22615

¿Cómo encuentro mi dirección IP interna? https://askubuntu.com/a/604691

Aquí está mi solución basada en algunas ideas de rsp compartidas en su repositorio ( https://github.com/rsp/scripts/ ).

Algunos de ustedes podrían decir que este script es extremadamente grande para una tarea tan simple, pero me gustaría hacerlo lo más fácil y flexible posible en su uso. Admite un archivo de configuración simple que permite redefinir los valores predeterminados.

Fue probado con éxito bajo Cygwin, MINGW y Linux (Red Hat).

Mostrar dirección IP interna

myip -i

Mostrar dirección IP externa

myip -e

Código fuente, también disponible en el enlace: https://github.com/ildar-shaimordanov/tea-set/blob/master/home/bin/myip . El ejemplo del archivo de configuración está allí, junto al script principal.

#!/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
jsxt
fuente
3

Solo utilizo nombres de interfaz de red , mi comando personalizado es

[[ $(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' 

en mi propio cuaderno

[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 ~]$

pero si la interfaz de red posee al menos una ip, mostrará todas las ip que le pertenecen

por ejemplo

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 ~]#

Parece que ese comando ip route get 1 | awk '{print $NF;exit}'proporcionado por el enlace es más preciso, lo que es más, es más corto.

Comunidad
fuente
2

No estoy seguro si esto funciona en todos los sistemas operativos, pruébelo.

ifconfig | awk -F"[ :]+" '/inet addr/ && !/127.0/ {print $4}'
Jotne
fuente
No funciona en CentOS 7.0
Benoit Blanchon
@BenoitBlanchon Entonces usa esto ip route get 1 | awk '{print $NF;exit}'. Debería funcionar en la mayoría de los sistemas.
Jotne
Indeed ip route get 1 | awk '{print $NF;exit}'funciona
Benoit Blanchon
2

Hay un paquete de nodos para todo. Es multiplataforma y fácil de usar.

$ npm install --global internal-ip-cli

$ internal-ip
fe80::1

$ internal-ip --ipv4
192.168.0.3

Este es un enfoque controvertido, pero el uso de npm para herramientas se está volviendo más popular, nos guste o no.

Dennis
fuente
1

Si conoce la interfaz de red (eth0, wlan, tun0, etc.):

ifconfig eth0 | grep addr: | awk '{ print $2 }' | cut -d: -f2
droidgren
fuente
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
user2802053
fuente
no funciona en 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]*' 
AlanG
fuente
1

Funciona en Mac, Linux y dentro de Docker Containers:

$ 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; salida}')

También funciona Makefilecomo:

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}')}

peleteiro
fuente
Mac no funciona: hostname --ip-address=> hostname: illegal option -- -en macOS Sierra
JL Peyret
1

Para Linux, lo que necesita es este comando:

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

escriba esto en su shell y simplemente sabrá su ip.

Statham
fuente
No, no funciona.
FractalSpace
1

Esto es más fácil de leer: ifconfig | grep 'inet addr:' |/usr/bin/awk '{print $2}' | tr -d addr:

Cory Thorson
fuente
no funciona en macOS 10.12.6
Antoine F.
1

Si tiene npme nodeinstaló:npm install -g ip && node -e "const ip = require('ip'); console.log(ip.address())"

Antoine F.
fuente