如何仅使用sysfs在LINUX中检查以太网接口是否具有某些IP?

如何仅使用sysfs在LINUX中检查以太网接口是否具有某些IP?,linux,linux-kernel,ip,sysfs,Linux,Linux Kernel,Ip,Sysfs,在搜索时,我遇到了/sys/class/net/eth0/operate(将包含“向上/向下”)和/sys/class/net/eth0/carrier(将包含“0/1”),其值取决于接口是否为“向上/向下”以及任何物理以太网电缆是否连接到以太网端口,但它不会告诉接口是否有IP。那么,有没有办法通过使用sysfs或使用任何其他虚拟文件系统来确定以太网接口是否有IP?sysfs中没有任何内容可以告诉您IP地址。网络系统总是有点不同,例如,网络接口不是设备节点,它不使用sysfs。网络硬件,是的,但

在搜索时,我遇到了
/sys/class/net/eth0/operate(将包含“向上/向下”)
/sys/class/net/eth0/carrier(将包含“0/1”)
,其值取决于接口是否为“向上/向下”以及任何物理以太网电缆是否连接到以太网端口,但它不会告诉接口是否有IP。那么,有没有办法通过使用sysfs或使用任何其他虚拟文件系统来确定以太网接口是否有IP?

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\u设备状态激活

我有点不清楚。你所说的“接口有任何IP”和“通知”是什么意思?您的意思是收到DHCP地址分配或IP地址手动更改事件的通知?或者您只是想在文件系统上查找指定接口的当前IP地址?按照sysfs与POSIX无关的方式读取。我认为您应该删除此标签或编辑您的问题,以表明您正在试图找到符合POSIX的解决方案。谢谢您的回答。我用套接字来识别网络接口的IP地址,可以有多个网络接口。