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/tcp
que 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 show
tambié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 ifconfig
o (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 unafixed-address xxx.xxx...
línea que se parece al archivo pegado de la respuesta de Linuxfanentradas en
/var/log/syslog
con 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 eth0
a la que prefiera o incluso -a
para todas.
ifconfig eth0 | grep "inet addr" | cut -d : -f 2 | cut -d ' ' -f 1
No se necesita mucho más time
que grep
-ing un solo archivo, lo anterior toma
real 0m0.002s, user 0m0.000s, sys 0m0.000s
mientras 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