¿Leer la dirección IP actual del sistema de archivos?

¿Leer la dirección IP actual del sistema de archivos?

Estoy escribiendo un programa que necesita saber la dirección IPv4 actual del sistema (recibida a través de DHCP), si está conectado y tiene una. Por el bien del argumento, el idioma es irrelevante y debo leer desde un archivo en el disco. ¿Existe algún archivo que siempre almacene la dirección IPv4 actual?

Respuesta1

Hay un archivo /proc/net/tcpque almacena la dirección IP en el formato de número hexadecimal little-endian de cuatro bytes. Sin embargo, esto supone que hay una sesión abierta para encontrar la dirección IP. Aparte de eso, ip addr showtambién puedes usar el comando.

Debe invertir la cadena para obtener la dirección IP. Referirse aesteResponda sobre cómo obtener el resultado del archivo /proc/net/tcp.

Respuesta2

No hay ningún archivo en el disco que garantice que contenga la dirección IP actual. Si obtuvo su dirección IP a través de DHCP, el DHCP probablemente escribió la dirección en algún lugar, pero no existe una ubicación estándar.

La forma normal y portátil de obtener la dirección IP actual sería analizar la salida de ifconfigo (solo Linux) ip addr show. Tenga en cuenta que además de la dirección de la conexión principal a Internet, también existe la dirección de bucle invertido 127.0.0.1 y, a menudo, hay más (para redes internas, máquinas virtuales, etc.). Una buena sugerencia es recuperar la dirección de la interfaz que proporciona la primera ruta predeterminada.

default_interface=$(route -n | awk '$1 == "0.0.0.0" {print $8; exit}')
ip_address=$(ifconfig "$default_interface" | awk 'sub(/.* inet addr:/, "") {print $1}')

Respuesta3

Eché un vistazo a /var/lib/dhcp/la carpeta de Linux Mint (basada en Ubuntu 14.04) y el único archivo que había estaba vacío.

Pero buscando en cada archivo, encontré:

  • /var/lib/NetworkManager/dhclient-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx-eth0.lease
    (con las letras y números casi aleatorios de la x) con una fixed-address xxx.xxx...línea que se parece al archivo pegado de la respuesta de Linuxfan

  • entradas en/var/log/syslogcon la dirección IP (por ejemplo aquí 192.168.1.2), puede elegir una de estas (quizás la última en caso de que cambie con frecuencia)

    8 de enero 17:49:45 mint dhclient: DHCPREQUEST de 192.168.1.2 en eth0 a 255.255.255.255 puerto 67 (xid=0xXXXXXXXX)
    8 de enero 17:49:45 mint dhclient: DHCPOFFER de 192.168.1.2 de 192.168.1.1
    8 de enero de 17 :49:45 mint dhclient: DHCPACK de 192.168.1.2 desde 192.168.1.1
    8 de enero 17:49:45 mint dhclient: vinculado a 192.168.1.2 - renovación en 38149 segundos.
    8 de enero 17:49:45 mint NetworkManager[1363]: dirección 192.168.1.2
    8 de enero 17:49:45 mint avahi-daemon[1117]: Unirse al grupo de multidifusión mDNS en la interfaz eth0.IPv4 con la dirección 192.168.1.2.
    8 de enero 17:49:45 mint avahi-daemon[1117]: Registro de un nuevo registro de dirección para 192.168.1.2 en eth0.IPv4.

O, si está utilizando un bash u otro script de shell o algo compatible con shell, aquí tiene una forma grep & cut compatible con tuberías para obtener la ip ifconfig, cambiarla eth0a la que prefiera o incluso -apara todas.

ifconfig eth0 | grep "inet addr" | cut -d : -f 2 | cut -d ' ' -f 1

No se necesita mucho más timeque grep-ing un solo archivo, lo anterior toma real 0m0.002s, user 0m0.000s, sys 0m0.000smientras grep-ing un archivo tomareal 0m0.001s, user 0m0.000s, sys 0m0.000s

Respuesta4

Toda la información de concesión de DHCP se guarda en/var/lib/dhcp/dhclient.eth0.leases

# tail -14 /var/lib/dhcp/dhclient.eth0.leases 
lease {
  interface "eth0";
  fixed-address 192.168.0.13;
  option subnet-mask 255.255.255.0;
  option routers 192.168.0.1;
  option dhcp-lease-time 604800;
  option dhcp-message-type 5;
  option domain-name-servers 75.75.75.75,75.75.76.76;
  option dhcp-server-identifier 192.168.0.1;
  option domain-name "hsd1.ca.comcast.net.";
  renew 6 2015/01/10 10:38:07;
  rebind 2 2015/01/13 16:19:22;
  expire 3 2015/01/14 13:19:22;
}

Dicho esto, no está de más analizar también el resultado deifconfig

información relacionada