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

时间:2017-03-30 17:15:19

标签: linux bash networking procfs sysfs

如何仅使用/ 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地址。

1 个答案:

答案 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网络(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;它始终是环回接口。)