Linux获取所有networking接口名称

我需要收集所有的界面名称,甚至是那些目前还没有的名称。 像ifconfig -a一样。

getifaddrs()多次遍历相同的接口名称。 我怎样才能使用getifaddrs()来收集所有的接口名称?

Solutions Collecting From Web of "Linux获取所有networking接口名称"

您可以检查来自getifaddrs的条目属于AF_PACKET系列。 在我的系统上,似乎列出所有接口:

 struct ifaddrs *addrs,*tmp; getifaddrs(&addrs); tmp = addrs; while (tmp) { if (tmp->ifa_addr && tmp->ifa_addr->sa_family == AF_PACKET) printf("%s\n", tmp->ifa_name); tmp = tmp->ifa_next; } freeifaddrs(addrs); 

看来, ifconfig -a只列出了活动接口(至少在Fedora 19上)。 我知道我至少还有一张网卡没有看到。 无论如何,我得到的列表如下:

 ls -1 /sys/class/net 

这可以通过编程方式轻松完成。

你在正确的轨道上(这是getifaddrs)。 它为每个家庭返回一个接口,所以你得到eth0为ipv4,一个为ipv6。 如果你只想要每个接口,你必须自己uniq输出。

我需要系统正在使用的主要设备(假设只有一个),例如eth0 wlan0或RHEL7正在尝试执行的任何操作。

我一起砍的最好的是这样的:

 #!/bin/bash # -- Get me the interface for the main ip on system for each in $(ls -1 /sys/class/net) ;do result=$(ip addr show $each | awk '$1 == "inet" {gsub(/\/.*$/, "", $2); print $2}' | grep "$(hostname -I | cut -d' ' -f1)") if [ ! -z "${result// }" ] && [ -d /sys/class/net/${each// } ] ;then echo "Device: $each IP: $result" break; fi done 

示例输出:

  ./maineth.sh Device: enp0s25 IP: 192.168.1.6 

我这件事显示你所有的接口,至少对我来说

IP链接显示

 ls -1 /sys/class/net 

只显示接口名称

 lo p4p1 

getifaddrs()只会返回你的接口地址,而不是接口本身。

如果您的界面没有地址,或者没有请求的家庭地址,那么按照“AF_PACKET”的建议呢?

在这里,我有一个隧道接口(使用OpenVPN连接)的示例,以及我为每个网络接口列出来自getifaddrs()的所有条目的示例:

 [0] 1: lo address family: 17 (AF_PACKET) b4:11:00:00:00:01 address family: 2 (AF_INET) address: <127.0.0.1> address family: 10 (AF_INET6) address: <::1> [...] [5] 10: tun0 address family: 2 (AF_INET) address: <172.16.0.14> [EOF] 

巴姆。 “tun0”接口上没有AF_PACKET,但在系统上存在。

你应该,而是使用if_nameindex()系统调用,这正是你想要的。 换句话说,如果没有参数,它会返回系统上所有接口的列表:

 #include <net/if.h> void main (void) { struct if_nameindex *if_nidxs, *intf; if_nidxs = if_nameindex(); if ( if_nidxs != NULL ) { for (intf = if_nidxs; intf->if_index != 0 || intf->if_name != NULL; intf++) { printf("%s\n", intf->if_name); } } return ; } 

瞧。