ver saber publica para comandos comando cambiar bash unix ip ifconfig

bash - saber - ¿Cómo obtener la dirección IP principal de la máquina local en Linux y OS X?



ip linux command (30)

Esto funciona en Linux y OSX.

Esto obtendrá la interfaz asociada a la ruta por defecto.

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

Portátil Darwin 14.4.0 Versión del Kernel de Darwin 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 Thu Sep 3 04:03:03 EDT 2009 x86_64 x86_64 x86_64 GNU / Linux

echo $NET_IF

et0

echo $NET_IP

192.168.46.10

Estoy buscando una solución de línea de comandos que me devuelva la dirección IP principal (primera) del servidor local, 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 ifconfig está disponible en ambos, pero su salida no es tan consistente entre estas plataformas.


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

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

Introducción

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

El problema de 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

Poner 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

Ordenado de lujo

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 da como resultado STDOUT, la IP y una nueva línea , con un argumento, no se imprime nada, sino que se crea una variable denominada argumento y contiene IP sin nueva línea .

Nota2: Esto se probó en Debian, LaCie hackeado nas y MaxOs. Si esto no funciona en su entorno, ¡estaré muy interesado en los comentarios!

Versión anterior de esta respuesta.

(No se elimina porque se basa en sed , no en bash ).

Advertir: ¡Hay un problema con los locales!

Rápido y pequeño:

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

Explosionado (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 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 2018):

Esta secuencia de comandos buscará primero la ruta y la interfaz predeterminadas utilizadas para, luego buscará una red IP local que coincida con la puerta de enlace y rellene las variables. Las dos últimas líneas simplemente se imprimen, algo 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


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 información de la red es mediante 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, salida ip :

8.8.8.8 via 192.168.8.254 dev enp0s25 src 192.168.8.16 uid 1000 / cache

Para extraer la src ip, sed es la más ligera y compatible con el soporte de expresiones regulares:

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

Ej. 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 la columna posicional en la salida del comando;
  • el uso de ifconfig que está en desuso y, por ejemplo, no muestra múltiples IPs;
  • uso de awk para una tarea simple que 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 comando hostname , que no tiene la opción -I en todos los dispositivos y que devuelve 127.0.0.1 en mi caso.

En una Mac, considera lo siguiente:

scutil --nwi | grep -Eo ''[0-9]{1,3}/.[0-9]{1,3}/.[0-9]{1,3}/.[0-9]{1,3}''


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


Estoy extrayendo 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.


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

También funciona en Makefile como:

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


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 es cada vez más popular, nos guste o no.


Interfaz de red primaria IP

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


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

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


Lo siguiente funcionará en Linux pero no en OSX.

Esto no depende en absoluto de DNS, y funciona incluso si /etc/hosts no está configurado correctamente ( 1 es taquigrafía para 1.0.0.0 ):

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

o evitando awk y usando el DNS público de Google en 8.8.8.8 para mayor evidencia:

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

Una forma menos confiable: (ver comentario abajo)

hostname -I | cut -d'' '' -f1


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

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


Otra variante de ifconfig que funciona tanto en Linux como en OSX:

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


Para Linux, lo que necesitas es este comando:

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

Escribe esto en tu shell y simplemente sabrás tu ip.


Para máquinas linux (no OS X):

hostname --ip-address


Pasé por muchos enlaces (StackExchange, AskUbuntu, , etc.) y decidí combinar todas 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 compartidas por rsp 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. Es compatible con un archivo de configuración simple que permite redefinir los valores predeterminados.

Se probó 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


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

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


Si tiene npm y el node instalado: npm install -g ip && node -e "const ip = require(''ip''); console.log(ip.address())"


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

[[ $(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, entonces mostrará que todas las ip pertenecen a ella

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 el comando ip route get 1 | awk ''{print $NF;exit}'' ip route get 1 | awk ''{print $NF;exit}'' proporcionado por el link es más preciso, además, es más corto.


Suponiendo que necesite su IP pública primaria como se ve en el resto del mundo, pruebe cualquiera de estos:

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


También puede obtener la dirección IP versión 4 de eth0 usando 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


También puedes probar esto, aunque puede que te diga 127.0.0.1 :

hostname -i

o

hostname -I


Tengo que agregar a la respuesta de Collin Anderson que este método también se tiene en cuenta si tienes 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 se estaba usando, no solo si estaba funcionando o no. La mayoría de las otras respuestas devolverán ambas direcciones IP, lo que no es necesariamente útil, de todos modos para mi escenario.


Use grep para 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 .bashrc para crear su propio comando llamado myip por 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 sencilla es el hostname -I ( hostname -i para versiones anteriores del hostname de hostname pero ver comentarios). Sin embargo, esto es sólo en Linux.


Uso de algunos de los otros métodos Puede ingresar un conflicto en el que se definan múltiples direcciones IP en el sistema. Esta línea siempre obtiene la dirección IP utilizada de forma predeterminada.

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


en linux

hostname -I

en macOS

ipconfig getifaddr en0

Tenga en cuenta que el hostname -I devolver múltiples direcciones en un orden no confiable (ver man hostname ). Pero para mí, solo devuelve 192.168.1.X que es lo que querías.


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]*''


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


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


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