在Python中确定连接接口的IP地址(Linux)

1 投票
2 回答
2647 浏览
提问于 2025-04-16 05:09

在我的Linux电脑上,有三个网络接口,其中一个可能是连接到互联网的。我需要找出当前连接的接口的IP地址,但要注意,其他两个接口可能也有IP地址,只是没有连接。

我可以通过每个接口去ping一个网站,看看哪个接口可以连接,但我希望能更快一些,而不是等着ping超时。而且我不想依赖外部网站是否在线。

更新:

我的所有接口可能都有IP地址和网关。这是为了一个嵌入式设备。所以我们允许用户在比如说eth0eth1之间选择。但是如果用户选择的接口没有连接,我们就退回到eth2,理论上这个接口总是能用。

所以我需要做的就是先检查用户选择的接口是否连接,如果连接了就返回那个IP地址。如果没有连接,我就需要获取eth2的IP地址。我可以顺利获取接口的IP地址,只是需要判断哪个接口实际上是连接的。

2 个回答

0

解决方案在这里:http://code.activestate.com/recipes/439093-get-names-of-all-up-network-interfaces-linux-only/


import fcntl
import array
import struct
import socket
import platform
"""
global constants.  If you don't like 'em here,
move 'em inside the function definition.
"""
SIOCGIFCONF = 0x8912
MAXBYTES = 8096

def localifs():
    """
    Used to get a list of the up interfaces and associated IP addresses
    on this machine (linux only).

    Returns:
    List of interface tuples.  Each tuple consists of
    (interface name, interface IP)
    """
    global SIOCGIFCONF
    global MAXBYTES

    arch = platform.architecture()[0]

    # I really don't know what to call these right now
    var1 = -1
    var2 = -1
    if arch == '32bit':
        var1 = 32
        var2 = 32
    elif arch == '64bit':
        var1 = 16
        var2 = 40
    else:
        raise OSError("Unknown architecture: %s" % arch)

    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    names = array.array('B', '\0' * MAXBYTES)
    outbytes = struct.unpack('iL', fcntl.ioctl(
        sock.fileno(),
        SIOCGIFCONF,
        struct.pack('iL', MAXBYTES, names.buffer_info()[0])
        ))[0]

    namestr = names.tostring()
    return [(namestr[i:i+var1].split('\0', 1)[0], socket.inet_ntoa(namestr[i+20:i+24])) \
            for i in xrange(0, outbytes, var2)]


print localifs()

0

如果系统的默认网关很可靠,那么你可以从运行 route -n 命令的结果中找到相关信息。你要找的那一行包含 " UG "(注意中间有空格),这一行会显示网关的IP地址和当前活动接口的名称。

撰写回答