如何仅使用 sysfs 在 LINUX 中检查以太网接口是否与某个 IP 连接?

How to check whether an ethernet interface is up with some IP or not in LINUX only using sysfs?

在搜索时我遇到了 /sys/class/net/eth0/operstate(will contain "up/down")/sys/class/net/eth0/carrier(will contain either "0/1") ,其值取决于接口是否为“up/down”以及是否有任何物理以太网电缆连接到以太网端口或没有,但它不会告诉接口是否有任何 IP 或 not.so 有没有办法使用 sysfs 或使用任何其他虚拟文件系统来查找以太网接口是否有 IP?

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

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

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

如果接口出现在 /proc/net/route 中,那么它就在路由 table 中。通常任何已分配IP地址的接口都会出现在路由table中,路由会在分配IP的同时创建。但是不需要在路由中出现带有IP的接口table。使用 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,看看什么时候设备enters/leaves NM_DEVICE_STATE_ACTIVATED.