【问题标题】:How to check whether an ethernet interface is up with some IP or not in LINUX only using sysfs? [closed]如何仅使用 sysfs 在 LINUX 中检查以太网接口是否具有某些 IP? [关闭]
【发布时间】:2020-11-12 05:34:24
【问题描述】:

在搜索此内容时,我遇到了 /sys/class/net/eth0/operstate(will contain "up/down")/sys/class/net/eth0/carrier(will contain either "0/1") ,它们的值取决于接口是否“向上/向下”以及是否有任何物理以太网电缆连接到以太网端口,但它不会告诉接口是否有IP。那么有什么方法可以使用sysfs或使用任何其他虚拟文件系统来查找以太网接口是否有IP?

【问题讨论】:

  • 对我来说有点不清楚。 "interface has got any IP""notify" 是什么意思?您的意思是收到一些有关 DHCP 地址分配或手动更改 IP 地址事件的通知?或者您只是想在文件系统上查找指定接口的当前 IP 地址?
  • 顺便说一下 sysfs 与 POSIX 无关。我认为您应该删除此标签或编辑您的问题以表明您正在尝试找到符合 POSIX 的解决方案。

标签: linux linux-kernel ip sysfs


【解决方案1】:

sysfs 中没有任何内容可以告诉您 IP 地址。网络系统总是有点不同,例如网络接口不是设备节点,也不使用 sysfs。网络硬件,是的,但是网络层,没那么多。

/sys/class/net 中的接口列表是您所能获得的全部内容。那里的信息都是与设备相关的,没有网络、协议和非硬件地址。

/proc 中还有更多内容,但并不完全符合您的要求。您可以在/proc/net/dev 中获取接口列表。它不会告诉您接口是否已启动或是否分配了地址。

如果一个接口出现在/proc/net/route 中,那么它就在路由表中。通常,任何已分配 IP 地址的接口都会出现在路由表中,并且会在分配 IP 的同时创建路由。但是路由表中并不要求有IP的接口出现。使用 IPv4LL,甚至可以让没有路由的接口发送和接收数据包。

/proc/net/if_inet6 中有一个分配了 IPv6 地址的每个接口的列表,以及十六进制地址。但这只是 IPv6 而不是 IPv4。

如果您想通知地址被分配或删除,那么更好的方法是通过 netlink 套接字。您需要编写代码才能使用它。当接口添加、更改或删除地址时,将通过 netlink 套接字将 netlink 数据报发送到您的进程。数据报将包含接口名称和地址等内容。

这是一种更好的监控方式,因为您的进程可以在等待数据包的 netlink 套接字上休眠。当地址更改时,您会立即被唤醒。这将比在 sysfs 中连续轮询文件响应更快且效率更高。如果它多次更改,您也不必担心会丢失某些东西,例如在投票之间添加然后删除地址。它保留了事件的顺序。

如果系统正在运行 NetworkManager,或者其他兼容的,则可以通过 dbus 进行监控。信号org.freedesktop.NetworkManager.DeviceAdded 可以在新设备和每个设备上进行监控,例如/org/freedesktop/NetworkManager/Devices/1,可以监听信号org.freedesktop.NetworkManager.Device.StateChanged,看设备何时进入/离开NM_DEVICE_STATE_ACTIVATED

【讨论】:

  • 感谢您的回答。我解决了它使用套接字来识别网络接口的IP。
  • 可以有多个网络接口。
猜你喜欢
  • 1970-01-01
  • 2021-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多