【发布时间】:2017-03-30 17:15:19
【问题描述】:
如何仅使用 /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,以获取本地网络接口地址。从上述方法(使用 /proc/net/fib_trie)获取 IP 地址后,我尝试将这些 IP 地址与 /proc/net/route 中的“目标”IP 地址匹配以获取网络接口名称。但是,我的 /proc/net/route 包含某些接口(例如 enp0s3)的多个条目。例如,有两个具有不同 IP 地址的 enp0s3 条目(“Destination 列”)。此外,路由文件中的网络接口的 ip 确实与 ip 命令指示的值接近,但并不完全一致。
从fib_trie获取IP地址后,有没有更好的获取网络接口名称的方法?
我需要的输出是所有主机的网络接口名称和对应的 IPv4 IP 地址。
【问题讨论】:
-
如果您不使用任何命令,您打算如何获取您根本没有的任何信息?为什么这是一个约束?你到底在问什么?
-
你能告诉我们你用你正在尝试的实际命令和你需要的输出尝试了什么吗?
-
添加了更多信息以发布。谢谢
标签: linux bash networking procfs sysfs