如何仅使用 Linux 中的 fs 和 bash 从 IPv4 ip 地址获取接口名称?

How to get interface name from IPv4 ip address using only fs and bash in Linux?

如何仅使用 /proc、/dev、/sys 和 bash 等文件系统从 IPv4 IP 地址获取接口名称?这是否可以不使用命令(如 ip、ifconfig 等)?我也无法使用任何软件包或安装任何工具。

编辑: 这样做的原因是我试图从 Docker 容器中获取主机的接口名称和 IP 地址。该容器安装在主机的根目录下,并且可以访问主机的文件系统。但是,由于容器位于单独的命名空间中,ip 命令(以及其他类似命令,如 ifconfig)只会 return 容器的网络。因此,我认为获取主机的接口名称和 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/ which basically says that I can do cat /proc/net/fib_trie | grep -B 1 "32 host LOCAL" to find the IP addresses. I also see in 读到,我们可以通过模式匹配字符串“32 host”来过滤 fib_trie 以获取本地网络接口地址。从上述方法(使用 /proc/net/fib_trie)获取 IP 地址后,我尝试将这些 IP 地址与 /proc/net/route 中的 "destination" IP 地址匹配以获取网络接口名称。但是,我的 /proc/net/route 包含某些接口(例如 enp0s3)的多个条目。例如,有两个 enp0s3 条目具有不同的 IP 地址(“目标列”)。此外,路由文件中的网络接口的 ip 确实与 ip 命令指示的 ip 接近,但不完全相同。

从fib_trie获取IP地址后,是否有更好的获取网络接口名称的方法?

我需要的输出是所有主机的网络接口名称和相应的 IPv4 IP 地址。

我认为你那里有足够的信息。 /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

目的地和掩码字段是十六进制的——在小端机器上是字节反转的——并给你网络的范围。解释为:

  • 任何发往 192.168.0.0/24 网络 (0000A8C0 + 00FFFFFF) 的东西都将转到 eth0,不需要网关(换句话说,它与这台机器位于同一子网上)。
  • 任何发往 192.168.40.0/24 (0028A8C0 + 00FFFFFF) 的内容都将转到 eth1,无需网关。
  • 发往任何其他地址 (00000000 + 00000000) 的数据包会转到默认网关 192.168.0.1。
    (不确定;此行中的额外标志位或 "metric" 值可能将其标记为默认网关。但无论如何,如果它没有非零掩码或者在 0.0.0.0 地址范围内,它对现实世界中的路由没有用。)

由此我可以推断我的系统在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;它始终是环回接口。)