Lê o endereço IP atual do sistema de arquivos? [fechadas]

5

Estou escrevendo um programa que precisa saber o endereço IPv4 atual do sistema (recebido via DHCP), se ele estiver conectado e tiver um. Por uma questão de argumento, a linguagem é irrelevante e devo ler de um arquivo no disco. Existe tal arquivo que sempre armazena o endereço IPv4 atual?

    
por Crunchex 08.01.2015 / 19:40

4 respostas

4

Existe um arquivo /proc/net/tcp que armazena o endereço IP no formato hexadecimal de quatro bytes de little-endian. No entanto, isso pressupõe que uma sessão está aberta para encontrar o endereço IP. Além disso, você poderia usar o comando ip addr show também.

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

    
por 08.01.2015 / 20:57
4

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

A maneira normal e portátil de obter o endereço IP atual seria analisar a saída de ifconfig ou (somente Linux) ip addr show . Observe que, além do endereço da conexão principal com a Internet, há também o endereço de loopback 127.0.0.1 e geralmente 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}')
    
por 09.01.2015 / 00:55
1

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

Mas pesquisando todos os arquivos, descobri:

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

  • entradas em /var/log/syslog com o endereço IP (por exemplo, aqui 192.168.1.2), você pode escolher uma delas (talvez a última caso ela mude com frequência)

    Jan 8 17:49:45 mint dhclient: DHCPREQUEST of 192.168.1.2 on eth0 to 255.255.255.255 port 67 (xid=0xXXXXXXXX)
    Jan 8 17:49:45 mint dhclient: DHCPOFFER of 192.168.1.2 from 192.168.1.1
    Jan 8 17:49:45 mint dhclient: DHCPACK of 192.168.1.2 from 192.168.1.1
    Jan 8 17:49:45 mint dhclient: bound to 192.168.1.2 -- renewal in 38149 seconds.
    Jan 8 17:49:45 mint NetworkManager[1363]: address 192.168.1.2
    Jan 8 17:49:45 mint avahi-daemon[1117]: Joining mDNS multicast group on interface eth0.IPv4 with address 192.168.1.2.
    Jan 8 17:49:45 mint avahi-daemon[1117]: Registering new address record for 192.168.1.2 on eth0.IPv4.

Ou, se você estiver usando um script bash ou outro shell ou algo amigável, aqui está um grep & corte caminho para obter o ip de ifconfig , altere eth0 para o que você preferir, ou mesmo -a para todos.

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

Não é preciso muito mais time do que grep - em um único arquivo, o acima real 0m0.002s, user 0m0.000s, sys 0m0.000s enquanto grep -ing um arquivo leva real 0m0.001s, user 0m0.000s, sys 0m0.000s

    
por 08.01.2015 / 21:10
1

Todas as informações de concessão do 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 faz mal também analisar a saída de ifconfig

    
por 08.01.2015 / 19:44

Tags