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.

curl -4 ifconfig.co. Contestará con su dirección IP4 externa.Respuestas:
Use
greppara 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
.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 dehostnamepero ver comentarios). Sin embargo, esto es solo en Linux.fuente
-Eopción para RE extendido, no la-ropción de estilo GNU .-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 agrepla-Eopción de. No tengo idea de por qué la gente de GNU optó por ella-r.-Epara asegurarse de portabilidad, se podría pensar que--helpyman pagesse actualizarían .. sí causó cierta confusión para mí anteriormente en otra pregunta utilizando-ELo 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 de1.0.0.0):o evitando
awky usando el DNS público de Google en8.8.8.8obvio:Una forma menos confiable: (ver comentario más abajo)
fuente
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.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 -ies la forma abreviada equivalentehostnameGNU Coreutils versión 8.26.hostname -isolo da la IP local, mientras quehostname -Ida todas las otras IPsen Linux
en macOS
hostname -Ipuede devolver varias direcciones en un orden poco confiable (vea la página dehostnamemanual ), pero para mí solo regresa192.168.1.X, que es lo que quería.fuente
hostname -icon un menor I.-ibandera 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:-osalida de una línearoute get toobtener la ruta real del kernel a un destino8.8.8.8IP de Google, pero puede usar la IP real que desea alcanzarpor ejemplo,
ipsalida:Para extraer el
srcip,sedes el más ligero y más compatible con el soporte de expresiones regulares:-nsin 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.8Por 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:
ifconfigcuales está en desuso y, por ejemplo, no enumera las direcciones IP múltiples;awkpara una tarea simple que sed puede manejar mejor;ip route get 1no está claro, y en realidad es un alias paraip route get to 1.0.0.0hostnamecomando, que no tiene-Iopción en todos los dispositivos y que regresan127.0.0.1en 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
sbinno está en mi$PATHruta completa, tengo que especificarla, pero también existe la misma ruta en MacOS. :-)timepara 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-addresssolo me da127.0.0.1en 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 -1al 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
bashalias: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
ifconfigvariante 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
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}')}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
npmenodeinstaló:npm install -g ip && node -e "const ip = require('ip'); console.log(ip.address())"fuente