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 ifconfig
está disponible en ambos, pero su salida no es tan consistente entre estas plataformas.
curl -4 ifconfig.co
. Contestará con su dirección IP4 externa.Respuestas:
Use
grep
para filtrar la dirección IP deifconfig
: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 simple es
hostname -I
(hostname -i
para versiones anteriores dehostname
pero ver comentarios). Sin embargo, esto es solo en Linux.fuente
-E
opción para RE extendido, no la-r
opción de estilo GNU .-E
. Las versiones recientes de FreeBSD han agregado la-r
opción como un alias para-E
facilitar 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-E
estaba destinado a ser comparable agrep
la-E
opción de. No tengo idea de por qué la gente de GNU optó por ella-r
.-E
para asegurarse de portabilidad, se podría pensar que--help
yman pages
se actualizarían .. sí causó cierta confusión para mí anteriormente en otra pregunta utilizando-E
Lo siguiente funcionará en Linux pero no en OSX.
Esto no depende del DNS en absoluto, y funciona incluso si
/etc/hosts
no está configurado correctamente (1
es la abreviatura de1.0.0.0
):o evitando
awk
y usando el DNS público de Google en8.8.8.8
obvio:Una forma menos confiable: (ver comentario más abajo)
fuente
hostname -I
no 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.ip route get 1 | awk '{print $(NF-2);exit}'
funciona mientras me añaden a la salidaip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p'
Para máquinas Linux (no OS X):
fuente
hostname -i
es la forma abreviada equivalentehostname
GNU Coreutils versión 8.26.hostname -i
solo da la IP local, mientras quehostname -I
da todas las otras IPsen Linux
en macOS
hostname -I
puede devolver varias direcciones en un orden poco confiable (vea la página dehostname
manual ), pero para mí solo regresa192.168.1.X
, que es lo que quería.fuente
hostname -i
con un menor I.-i
bandera dice lo siguiente:Avoid using this option; use hostname -I instead
.Solución
Explicación
La forma correcta de consultar la información de la red es usar
ip
:-o
salida de una línearoute get to
obtener la ruta real del kernel a un destino8.8.8.8
IP de Google, pero puede usar la IP real que desea alcanzarpor ejemplo,
ip
salida:Para extraer el
src
ip,sed
es 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 alcanzar8.8.8.8
Por ejemplo, salida final:
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:
ifconfig
cuales está en desuso y, por ejemplo, no enumera las direcciones IP múltiples;awk
para una tarea simple que sed puede manejar mejor;ip route get 1
no está claro, y en realidad es un alias paraip route get to 1.0.0.0
hostname
comando, que no tiene-I
opción en todos los dispositivos y que regresan127.0.0.1
en mi caso.fuente
Editado (
2014-06-012018-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 endefault route
. Publico este script al final de esta respuesta.Introducción
Como ambos os tienen golpetazo 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
:Poniendo esto en una función:
Mínimo:
Uso simple:
Elegante ordenado:
Uso:
o, ejecutando la misma función, pero con un argumento:
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
, nobash
).Advertir: ¡Hay un problema con las configuraciones regionales!
Rápido y pequeño:
Explotado (trabajo también;)
Editar:
¡Cómo! Esto parece no funcionar en Mac OS ...
Ok, esto parece funcionar bastante igual en Mac OS que en mi Linux :
dividido:
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:
o
Bueno, ahí está:
fuente
sbin
no está en mi$PATH
ruta completa, tengo que especificarla, pero también existe la misma ruta en MacOS. :-)time
para seleccionar cuál usaría tanto tiempo ...Específico solo para ciertas compilaciones de Ubuntu. Aunque puede que solo te diga
127.0.0.1
:o
fuente
$ hostname --ip-address
solo me da127.0.0.1
en Arch LinuxTambién puede obtener la dirección IP versión 4 de eth0 utilizando este comando en linux
La salida será así
fuente
Esto funciona en Linux y OSX
Esto obtendrá la interfaz asociada a la ruta predeterminada
Usando la interfaz descubierta anteriormente, obtenga la dirección IP.
OSX
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
en5
192.168.0.130
CentOS Linux
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
eth0
192.168.46.10
fuente
| head -1
al final de la primera línea para obtener la interfaz predeterminada, y el resto es bueno.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.
fuente
Extraigo mi comentario a esta respuesta:
Se basa en la respuesta de @CollinAnderson que no funcionó en mi caso.
fuente
fuente
bash
alias:alias myip="ifconfig | grep 'inet ' | grep -v '127.0.0.1' | awk '{print \$2}'"
La forma más corta de obtener su dirección ipv4 local en su sistema Linux:
fuente
Suponiendo que necesita su IP pública principal como se ve desde el resto del mundo, pruebe cualquiera de los siguientes:
fuente
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.
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.
fuente
IP de interfaz de red primaria
fuente
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
Funciona en Linux.
Prueba:
fuente
fuente
Otra
ifconfig
variante que funciona tanto en Linux como en OSX:fuente
ifconfig | grep '\<inet\>' | cut -d ' ' -f2 | grep -v '127.0.0.1'
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
Mostrar dirección IP externa
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.
fuente
Solo utilizo nombres de interfaz de red , mi comando personalizado es
en mi propio cuaderno
pero si la interfaz de red posee al menos una ip, mostrará todas las ip que le pertenecen
por ejemplo
Ubuntu 16.10
Debian Jessie
CentOS 6.8
Fedora 24
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.fuente
No estoy seguro si esto funciona en todos los sistemas operativos, pruébelo.
fuente
ip route get 1 | awk '{print $NF;exit}'
. Debería funcionar en la mayoría de los sistemas.ip route get 1 | awk '{print $NF;exit}'
funcionaHay un paquete de nodos para todo. Es multiplataforma y fácil de usar.
Este es un enfoque controvertido, pero el uso de npm para herramientas se está volviendo más popular, nos guste o no.
fuente
Si conoce la interfaz de red (eth0, wlan, tun0, etc.):
fuente
fuente
fuente
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
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}')}
fuente
hostname --ip-address
=>hostname: illegal option -- -
en macOS SierraPara Linux, lo que necesita es este comando:
escriba esto en su shell y simplemente sabrá su ip.
fuente
Esto es más fácil de leer:
ifconfig | grep 'inet addr:' |/usr/bin/awk '{print $2}' | tr -d addr:
fuente
Si tiene
npm
enode
instaló:npm install -g ip && node -e "const ip = require('ip'); console.log(ip.address())"
fuente