繁体   English   中英

如何在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)将仅返回容器的网络。 因此,我认为获取主机的接口名称和IP地址的唯一方法是通过主机的根目录(/ hostroot / proc,/ hostroot / sys等)。 请注意,启动容器时我不能使用--net = host标志(它告诉容器使用主机的net命名空间)。

我尝试从/ 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地址与/ proc / net / route中的“目标”IP地址进行匹配,以获取网络接口名称。 但是,我的/ proc / net / route包含一些接口的多个条目(例如enp0s3)。 例如,有两个具有不同IP地址的enp0s3条目(“目标列”)。此外,路由文件中的网络接口确实具有接近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

目标和掩码字段是十六进制的 - 在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;它始终是环回接口。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM