Прочитать текущий IP-адрес из файловой системы?

Прочитать текущий IP-адрес из файловой системы?

Я пишу программу, которой нужно знать текущий IPv4-адрес системы (полученный через DHCP), если она подключена и имеет его. Для удобства аргумента, язык не имеет значения, и я должен читать из файла на диске. Есть ли такой файл, который всегда хранит текущий IPv4-адрес?

решение1

Есть файл /proc/net/tcp, который хранит IP-адрес в формате little-endian четырехбайтового шестнадцатеричного числа. Однако это предполагает, что открыт сеанс для поиска IP-адреса. Кроме этого, вы ip addr showтакже можете использовать команду.

Вам нужно перевернуть строку, чтобы получить IP-адрес. См.этотответьте, как получить вывод из файла /proc/net/tcp.

решение2

На диске нет файла, который гарантированно содержал бы текущий IP-адрес. Если вы получили свой IP-адрес через DHCP, DHCP, вероятно, записал адрес где-то, но стандартного расположения нет.

Обычный, переносимый способ получить текущий IP-адрес — это проанализировать вывод ifconfigили (только для Linux) ip addr show. Обратите внимание, что в дополнение к адресу основного интернет-подключения есть также адрес обратной связи 127.0.0.1, а часто их больше (для внутренних сетей, виртуальных машин и т. д.). Хорошей подсказкой будет извлечь адрес интерфейса, который предоставляет первый маршрут по умолчанию.

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

решение3

Я посмотрел /var/lib/dhcp/папку Linux Mint (на базе Ubuntu 14.04) и обнаружил там единственный пустой файл.

Но просмотрев все файлы, я нашел:

  • /var/lib/NetworkManager/dhclient-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx-eth0.lease
    (с почти случайными буквами и цифрами в x) со fixed-address xxx.xxx...строкой, которая выглядит как вставленный файл из ответа linuxfan

  • записи в/var/log/syslogс IP-адресом (например, здесь 192.168.1.2), вы можете выбрать один из них (возможно, последний, если он часто меняется)

    8 января 17:49:45 mint dhclient: DHCPREQUEST из 192.168.1.2 на eth0 на 255.255.255.255 порт 67 (xid=0xXXXXXXXXX)
    8 января 17:49:45 mint dhclient: DHCPOFFER из 192.168.1.2 с 192.168.1.1
    8 января 17:49:45 mint dhclient: DHCPACK из 192.168.1.2 с 192.168.1.1
    8 января 17:49:45 mint dhclient: привязан к 192.168.1.2 -- обновление через 38149 секунд.
    8 января 17:49:45 mint NetworkManager[1363]: адрес 192.168.1.2
    8 января 17:49:45 mint avahi-daemon[1117]: Присоединение к группе многоадресной рассылки mDNS на интерфейсе eth0.IPv4 с адресом 192.168.1.2.
    8 января 17:49:45 mint avahi-daemon[1117]: Регистрация новой записи адреса для 192.168.1.2 на eth0.IPv4.

Или, если вы используете bash или другой скрипт оболочки или что-то дружественное к оболочке, вот удобный для конвейера способ получения IP-адреса с помощью grep & cut ifconfig, измените eth0на тот, который вам больше нравится, или даже -aдля всех.

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

Это не займет много больше, timeчем grep-ing одного файла, вышеприведенный процесс занимает, real 0m0.002s, user 0m0.000s, sys 0m0.000sв то время как grep-ing одного файла занимаетreal 0m0.001s, user 0m0.000s, sys 0m0.000s

решение4

Вся информация об аренде DHCP сохраняется в/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;
}

Сказав это, не помешает также проанализировать выводifconfig

Связанный контент