如何仅使用/ proc,/ dev,/ sys和bash等文件系统从IPv4 IP地址获取接口名称?这可能不使用命令(如ip,ifconfig等)吗?我也无法使用任何软件包或安装任何工具。
编辑: 原因是我试图从Docker容器中获取主机的接口名称和IP地址。容器安装有主机的根目录,可以访问主机的文件系统。但是,由于容器位于单独的命名空间中,因此ip命令(以及其他类似命令,如ifconfig)将仅返回容器的网络。因此,我认为获取主机的接口名称和IP地址的唯一方法是通过主机的根目录(/ hostroot / proc,/ hostroot / sys等)。请注意,启动容器时我不能使用--net = host标志(它告诉容器使用主机的网络命名空间)。
我尝试从/ proc / net / fib_trie文件中查找所有网络接口IP地址(IPv4)。我在https://regexit.com/3-ways-to-get-your-ip-on-a-linux-system/阅读,基本上说我可以做cat / proc / net / fib_trie | grep -B 1" 32 host LOCAL"找到IP地址。我还在https://stackoverflow.com/a/42082822中看到,我们可以通过模式匹配字符串" 32 host"来过滤fib_trie。获取本地网络接口地址。从上面的方法获取IP地址(使用/ proc / net / fib_trie)后,我尝试将这些IP地址与" destination"匹配。获取网络接口名称的/ proc / net / route中的IP地址。但是,我的/ proc / net / route包含一些接口的多个条目(例如enp0s3)。例如,有两个具有不同IP地址的enp0s3条目("目标列)。此外,路由文件中的网络接口确实具有接近ip命令指示但不完全正确的IP。
从fib_trie获取IP地址后,是否有更好的方法获取网络接口名称?
我需要的输出将是所有主机的网络接口名称和相应的IPv4 IP地址。
答案 0 :(得分:2)
我认为你有足够的信息。 /proc/net/route
文件并未真正列出地址。它应该告诉你如何路由数据包。但是你可以从中收集有关接口的信息。在我的系统上(ubuntu 14这样不同的接口名称格式,但本来应该是相似的),它显示了这个:
Iface Destination Gateway Flags RefCnt Use Metric Mask MTU Window IRTT
eth0 00000000 0100A8C0 0003 0 0 0 00000000 0 0 0
eth0 0000A8C0 00000000 0001 0 0 1 00FFFFFF 0 0 0
eth1 0028A8C0 00000000 0001 0 0 1 00FFFFFF 0 0 0
目标和掩码字段是十六进制的 - 在little-endian机器上进行字节反转 - 并为您提供网络范围。解释是:
由此我可以推断出我的系统在192.168.0.0/24和192.168.40.0/24网络中具有IP地址。 /proc/net/fib_trie
上的grep命令输出显示在我的系统上:
|-- 127.0.0.1
/32 host LOCAL
|-- 192.168.0.104
/32 host LOCAL
|-- 192.168.40.129
/32 host LOCAL
这样就可以清楚地知道我的本地IP地址是192.168.0.104(eth0)和192.168.40.129(eth1)。 (我们可以忽略127.0.0.1;它始终是环回接口。)