Linux获取所有网络接口名称

时间:2013-10-07 14:43:48

标签: c linux network-interface

我需要收集所有的界面名称,即使是目前尚未启动的界面名称。与ifconfig -a一样。

getifaddrs()多次迭代相同的接口名称。如何使用getifaddrs()只收集所有界面名称?

7 个答案:

答案 0 :(得分:19)

您可以检查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);

答案 1 :(得分:7)

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]

的Bam。 “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 ;
}

瞧瞧。

答案 2 :(得分:5)

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

ls -1 /sys/class/net

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

答案 3 :(得分:3)

你走在正确的轨道上(它是getifaddrs)。它每个系列返回一次接口,因此你得到ipv4的eth0和ipv6的eth0。如果您只想要每个接口,则必须自己完成输出。

答案 4 :(得分:2)

我认为这显示了所有界面,至少对我而言

ip link show

ls -1 /sys/class/net

仅显示界面名称

lo
p4p1

答案 5 :(得分:1)

我需要系统正在使用的主设备(假设只有一个),例如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

答案 6 :(得分:0)

使用这个。为了便于理解,我添加了适当的注释。

onContextMenu