Hay fallas fundamentales en su pregunta. En primer lugar, los hosts pueden tener (y probablemente tendrán) más de una dirección (por ejemplo, varias interfaces) e incluso más de una dirección por interfaz. Este es un problema aún mayor con IPv6, donde cada host conectado globalmente es al menos dos direcciones.
En segundo lugar, la "mejor" manera de hacer esto desde un shell variará de un sistema a otro.
Linux:
/sbin/ip addr show eth0 | awk -F"[ /]+" '/inet / {print $3}'
>=Solaris 11:
ipadm show-addr net0/v4 | awk -F"[ /]+" '/ok/ {print $5}'
Mac OS X/Darwin:
ipconfig getifaddr en0
Incluso usando el mínimo común denominador y usando ifconfig
no será consistente porque el formato de salida puede cambiar. Sin embargo, para limpiar su ejemplo, use esto:
ifconfig eth0 | awk -F"[ :]+" '/inet / {print $4}'
Si está utilizando un lenguaje más sofisticado como Perl, Ruby, Java, etc., en lugar del shell, cada lenguaje tendrá su propia forma de obtener estos datos del kernel. Te dejaré encontrar esto a ti.
La información puede cambiar en cualquier momento, por lo que debe recuperarse del kernel, no se puede almacenar en un archivo.
No hay una manera realmente agradable de obtener esta información. Su análisis es tan bueno como cualquier otro, excepto que la codificación de la segunda línea es incorrecta:no hay garantía de que las interfaces se enumeren en un orden particular. Es bastante común que una máquina tenga más de una interfaz:es posible que tenga varias tarjetas de red o interfaces virtuales.
A menudo, la dirección IP que le interesa es la asociada con la ruta predeterminada. Con la mayoría de las configuraciones, puede obtener la interfaz correcta con el route
comando, luego extraiga la dirección IP de esa interfaz con ifconfig
.
/sbin/ifconfig $(/sbin/route -n |
awk '$1 == "0.0.0.0" {print $8}') |
awk 'match($0, /inet addr:[.0-9]+/) {print substr($0, RSTART+10, RLENGTH-10)}'
Tenga en cuenta que no es necesario llamar a sudo
. ifconfig
y route
a menudo no están en el PATH
predeterminado para usuarios que no sean root, pero puede usarlos sin privilegios especiales siempre que solo lea información y no cambie la configuración.
En las variantes de Unix que no sean Linux, es posible que deba modificar los comandos anteriores. La mayoría tiene comandos llamados ifconfig
y route
, pero el formato de salida puede ser diferente.
En Linux, en lugar de ifconfig
y route
, puedes usar el ip
comando de la suite de herramientas iproute2. Mientras que los autores de iproute2 consideran ifconfig
y route
en desuso, de hecho hay pocas ventajas en usar ip
, ya que la salida de ip
no es notablemente más fácil de analizar, y ifconfig
y route
siempre están disponibles, mientras que algunas instalaciones de Linux simplificadas omiten ip
.
Todas las respuestas aquí son técnicamente correctas, pero no son lo que yo consideraría la respuesta "correcta". Desafortunadamente, su pregunta es extremadamente vaga (lo que puedo entender si no es muy bueno con el funcionamiento de las redes en Linux), por lo que le daré algunas respuestas a las posibles interpretaciones de la pregunta.
La IP principal de la máquina
La máquina tiene una IP por encima de todas las demás, que se considera la IP principal de la máquina. Sin embargo, tenga en cuenta que esto no tiene mucho sentido, ya que un cuadro puede tener varias direcciones IP y cuál se usa varía (hablaré de esto en un momento).
La IP principal es simplemente la IP asociada con el nombre de host de la máquina. Puede encontrar esta IP ejecutando lo siguiente
getent hosts "$(hostname)" | awk '{ print $1 }'
Ahora, lo que hace es buscar la IP para el nombre de host de la máquina según /etc/nsswitch.conf
. En la mayoría de los casos, el /etc/nsswitch.conf
el archivo contiene hosts: files dns
. Esto significa que cuando intente hacer cualquier tipo de búsqueda de nombre de host o dirección, buscará en /etc/hosts
primero, y luego consultar DNS (según lo configurado por /etc/resolv.conf
).
Entonces el comando getent hosts "$(hostname)"
probablemente tomará la entrada coincidente de /etc/hosts
. El awk
simplemente toma la IP de esa línea.
(getent
es solo una utilidad simple para consultar 'bases de datos' enumeradas en /etc/nsswitch.conf
)
La IP utilizada para comunicarse con el mundo exterior
Como mencioné anteriormente, la IP principal de la máquina no tiene mucho sentido. La máquina puede usar cualquiera de varias direcciones IP para la comunicación. En su caso, es probable que solo tenga una interfaz y una IP (no localhost). Sin embargo, un servidor puede tener varias interfaces o direcciones IP (a veces, varias direcciones IP en una sola interfaz).
La tabla de enrutamiento del kernel determina qué IP se utiliza. No voy a entrar en los detalles de cómo funciona la tabla de enrutamiento, ya que no es simple (hay varias tablas de enrutamiento, y cuál se usa depende de las reglas de selección de la tabla). Solo te diré cómo encontrar qué IP se usaría.
Para saber qué IP se utilizará para comunicarse con un destino específico, utilice el siguiente comando:
ip route get 1.2.3.4
(con 1.2.3.4
siendo la IP del destino)
En mi máquina, si hago esto con una de las direcciones IP de google.com (74.125.139.102
), obtengo lo siguiente:
74.125.139.102 via 192.168.0.1 dev wlan0 src 192.168.0.24
cache
Lo que esto me dice es que la IP 192.168.0.24
se usará siempre que mi máquina vaya a hablar con 74.125.139.102
.
Si solo desea la IP, puede lanzar un grep
extra al final.
ip route get 1.2.3.4 | grep -oP '(?<=src )\S+'
grep
se usa en lugar de un awk
porque es menos propenso a errores. Es posible que la línea cambie en la que la IP no estará en el mismo lugar, pero siempre seguirá a "src", por lo que tomamos el valor inmediatamente después de "src"
IP de puerta de enlace predeterminada
Por último, está la puerta de enlace predeterminada. Si no tiene un destino específico para consultar qué IP se usará, puede elegir uno de la puerta de enlace predeterminada. Si solo tiene una interfaz, esto es todo lo que importará de todos modos.
Esto es básicamente lo mismo que el anterior, simplemente usando la puerta de enlace predeterminada como nuestro destino para buscar
ip route get "$(ip route show to 0/0 | grep -oP '(?<=via )\S+')"
Esto le dará una línea como la de la sección anterior. El src
El valor es la IP que se usará para el tráfico que fluye a través de la puerta de enlace predeterminada.
Como en la sección anterior, para obtener solo la IP, agregue un grep
.
ip route get "$(ip route show to 0/0 | grep -oP '(?<=via )\S+')" | grep -oP '(?<=src )\S+'