¿Cómo determina una instancia de Linux su dirección IP?
Es decir, no el 127.0.0.1.
¿Está esto almacenado en un archivo o ifconfig lo calcula de alguna manera en cada invocación?
Logré resolverlo solo para demostrar que hice un esfuerzo, pero no es algo que pondría en una aplicación seria:
sudo ifconfig | head -n 2 | tail -n 1 | tr -s " " | tr " " ":" | cut -d":" -f 4
Respuesta1
Hay un defecto fundamental en su pregunta. En primer lugar, los hosts pueden (y probablemente tendrán) más de una dirección (por ejemplo, múltiples interfaces) e incluso más de una dirección por interfaz. Esto es un problema aún mayor con IPv6, donde cada host conectado globalmente al menosdosdirecciones.
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}'
MacOS X/Darwin:
ipconfig getifaddr en0
Incluso usar el mínimo común denominador y usarlo 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. Dejaré que tú busques esto.
Respuesta2
La información puede cambiar en cualquier momento, por lo que es necesario recuperarla del kernel, no se puede almacenar en un archivo.
No existe una forma 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: puede tener 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 y luego extraer 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 sudo
. ifconfig
y route
a menudo no están predeterminados PATH
para usuarios que no son root, pero puedes usarlos sin privilegios especiales siempre y cuando solo leas información y no cambies la configuración.
En variantes de Unix distintas de Linux, es posible que tengas que 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
, puede utilizar el ip
comando deliproute2conjunto de herramientas. Si bien los autores de iproute2 consideran ifconfig
que y route
está en desuso, de hecho hay pocas ventajas en usar ip
, ya que la salida de ip
no es mucho más fácil de analizar y siempre están disponibles, ifconfig
mientras route
que algunas instalaciones simplificadas de Linux omiten ip
.
Respuesta3
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 cual puedo entender si no sabe muy bien cómo funcionan las redes en Linux), por lo que daré algunas respuestas a 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 una caja puede tener múltiples 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 esto hace es buscar la IP del nombre de host de la máquina según /etc/nsswitch.conf
. En la mayoría de los casos, el /etc/nsswitch.conf
archivo contiene hosts: files dns
. Esto significa que cuando intente realizar cualquier tipo de búsqueda de nombre de host o dirección, buscará /etc/hosts
primero y luego consultará DNS (según lo configurado por /etc/resolv.conf
).
Por lo tanto, es probable que el comando getent hosts "$(hostname)"
obtenga la entrada coincidente de /etc/hosts
. Simplemente awk
toma la IP de esa línea.
( getent
es solo una utilidad simple para consultar las '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 prácticamente ningún significado. La máquina puede utilizar cualquiera de las múltiples 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 múltiples interfaces o IP (a veces múltiples IP en una sola interfaz).
La IP que se utiliza está determinada por la tabla de enrutamiento del kernel. No voy a entrar en detalles sobre cómo funciona la tabla de enrutamiento porque no es simple (hay varias tablas de enrutamiento y cuál se usa depende de las reglas de selección de tablas). Sólo te diré cómo encontrar qué IP se usaría.
Para saber qué IP se utilizará para comunicarse con un destino específico, use el siguiente comando:
ip route get 1.2.3.4
( 1.2.3.4
siendo la IP del destino)
En mi máquina, si hago esto con una de las 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 utilizará cada vez que mi máquina vaya a hablar 74.125.139.102
.
Si solo quieres la IP, puedes agregar una extra grep
al final.
ip route get 1.2.3.4 | grep -oP '(?<=src )\S+'
grep
se usa en lugar de an awk
porque es menos propenso a errores. Es posible que la línea cambie y la IP no esté en el mismo lugar, pero siempre seguirá a "src", por lo que simplemente 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 al que consultar para ver qué IP se utilizará, puede elegir el de la puerta de enlace predeterminada. Si sólo tienes una interfaz, esto es todo lo que importará de todos modos.
Esto es básicamente exactamente 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
valor es la IP que se utilizará 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 archivo grep
.
ip route get "$(ip route show to 0/0 | grep -oP '(?<=via )\S+')" | grep -oP '(?<=src )\S+'
Respuesta4
Su solicitud es ambigua, generalmente con la palabra "localhost" la gente se refiere a la interfaz loopback y 127.0.0.1 es la respuesta más común y correcta.
Lo que te falta es:
- El hecho de que cada interfaz puede tener una IP diferente, la interfaz loopback es una interfaz de red como su tarjeta Ethernet o su receptor USB inalámbrico.
- Como consecuencia, una sola PC no tiene una única IP, todo depende de qué interfaz esté considerando y cuántas interfaces esté utilizando en su sistema operativo.
Probablemente esté interesado en el tema "Tablas de enrutamiento del kernel", que es una buena manera de comenzar a comprender cómo el kernel maneja su actividad de red.