Ler o endereço IP atual do sistema de arquivos?

Ler o endereço IP atual do sistema de arquivos?

Estou escrevendo um programa que precisa saber o endereço IPv4 atual do sistema (recebido via DHCP), se estiver conectado e tiver um. Para efeito de argumentação, o idioma é irrelevante e devo ler um arquivo no disco. Existe um arquivo que sempre armazena o endereço IPv4 atual?

Responder1

Existe um arquivo /proc/net/tcpque armazena o endereço IP no formato de número hexadecimal little-endian de quatro bytes. No entanto, isso pressupõe que uma sessão esteja aberta para encontrar o endereço IP. Fora isso, você ip addr showtambém pode usar o comando.

Você precisa inverter a string para obter o endereço IP. Referir-seesseresposta sobre como obter a saída do arquivo /proc/net/tcp.

Responder2

Não há nenhum arquivo no disco que contenha o endereço IP atual. Se você obteve seu endereço IP através do DHCP, o DHCP provavelmente escreveu o endereço em algum lugar, mas não existe um local padrão.

A maneira normal e portátil de obter o endereço IP atual seria analisar a saída de ifconfigor (Linux-only) ip addr show. Observe que além do endereço da conexão primária com a Internet, existe também o endereço de loopback 127.0.0.1, e muitas vezes há mais (para redes internas, máquinas virtuais, etc.). Uma boa dica é recuperar o endereço da interface que fornece a primeira rota padrão.

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

Responder3

Dei uma olhada na /var/lib/dhcp/pasta do Linux Mint (baseado no Ubuntu 14.04) e o único arquivo estava vazio.

Mas pesquisando em cada arquivo, encontrei:

  • /var/lib/NetworkManager/dhclient-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx-eth0.lease
    (com letras e números quase aleatórios do x) com uma fixed-address xxx.xxx...linha que se parece com o arquivo colado da resposta do linuxfan

  • entradas em/var/log/syslogcom o endereço IP (por exemplo aqui 192.168.1.2), você pode escolher um destes (talvez o último caso mude com frequência)

    8 de janeiro 17:49:45 mint dhclient: DHCPREQUEST de 192.168.1.2 em eth0 para 255.255.255.255 porta 67 (xid = 0xXXXXXXXX)
    8 de janeiro 17:49:45 mint dhclient: DHCPOFFER de 192.168.1.2 de 192.168.1.1
    8 de janeiro 1 7 :49:45 mint dhclient: DHCPACK de 192.168.1.2 de 192.168.1.1
    8 de janeiro 17:49:45 mint dhclient: vinculado a 192.168.1.2 - renovação em 38.149 segundos.
    8 de janeiro 17:49:45 mint NetworkManager [1363]: endereço 192.168.1.2
    8 de janeiro 17:49:45 mint avahi-daemon [1117]: Ingressando no grupo multicast mDNS na interface eth0.IPv4 com endereço 192.168.1.2.
    8 de janeiro 17:49:45 mint avahi-daemon [1117]: Registrando novo registro de endereço para 192.168.1.2 em eth0.IPv4.

Ou, se você estiver usando um bash ou outro script de shell ou algo compatível com shell, aqui está uma maneira grep & cut amigável de obter o ip de ifconfig, mudar eth0para o que você preferir ou até mesmo -apara todos.

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

Não é preciso muito mais timedo que grep-ing um único arquivo, o procedimento acima leva real 0m0.002s, user 0m0.000s, sys 0m0.000senquanto grep-ing um arquivo levareal 0m0.001s, user 0m0.000s, sys 0m0.000s

Responder4

Todas as informações de concessão de DHCP são salvas em/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;
}

Dito isto, não custa nada analisar também a saída deifconfig

informação relacionada