从文件系统读取当前IP地址?

从文件系统读取当前IP地址?

我正在编写一个程序,需要知道系统当前的 IPv4 地址(通过 DHCP 接收)(如果已连接并且有的话)。为了便于讨论,语言无关紧要,我必须从磁盘上的文件中读取。是否有这样一个文件始终存储当前的 IPv4 地址?

答案1

有一个文件/proc/net/tcp以小端四字节十六进制数字格式存储 IP 地址。然而,这假设会话已打开以查找 IP 地址。除此之外,您ip addr show也可以使用命令。

您需要反转字符串才能获取 IP 地址。参考回答如何从文件中获取输出/proc/net/tcp

答案2

磁盘上没有任何文件可以保证包含当前的 IP 地址。如果您通过 DHCP 获取 IP 地址,DHCP 可能会将地址写入某处,但没有标准位置。

获取当前 IP 地址的正常、可移植方法是解析ifconfigor 的输出(仅限 Linux)ip addr show。请注意,除了主要 Internet 连接的地址之外,还有环回地址 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

我查看了 Linux Mint /var/lib/dhcp/(基于 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),您可以选择其中之一(也许是最后一个,以防它经常变化)

    1 月 8 日 17:49:45 mint dhclient:eth0 上的 192.168.1.2 的 DHCPREQUEST 到 255.255.255.255 端口 67 (xid=0xXXXXXXXX)
    1 月 8 日 17:49:45 mint dhclient:来自 192.168.1.1 的 192.168.1.2 的 DHCPOFFER
    17号:49:45 mint dhclient:来自 192.168.1.1 的 192.168.1.2 的 DHCPACK 于
    1 月 8 日 17:49:45 mint dhclient:绑定到 192.168.1.2——在 38149 秒内更新。
    Jan 8 17:49:45 mint NetworkManager[1363]:地址 192.168.1.2
    Jan 8 17:49:45 mint avahi-daemon[1117]:加入接口 eth0.IPv4 上的 mDNS 多播组,地址为 192.168.1.2。
    1 月 8 日 17:49:45 mint avahi-daemon[1117]:在 eth0.IPv4 上注册 192.168.1.2 的新地址记录。

或者,如果您使用的是 bash 或其他 shell 脚本或 shell 友好的脚本,这里有一个管道友好的 grep & cut 方法来获取 ip ifconfig,更改eth0为您喜欢的任何一个,甚至-a是全部。

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

它不会timegrep-ing 单个文件花费更多时间,上面的操作需要 real 0m0.002s, user 0m0.000s, sys 0m0.000s-inggrep一个文件需要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

相关内容