【问题标题】:Determine IP address of CONNECTED interface (linux) in python在python中确定CONNECTED接口(linux)的IP地址
【发布时间】:2011-04-22 13:25:24
【问题描述】:

在我的 linux 机器上,3 个网络接口中的 1 个可能实际连接到 Internet。我需要获取当前连接的接口的 IP 地址,记住我的其他 2 个接口可能分配了 IP 地址,只是没有连接。

我可以通过我的每个接口 ping 一个网站以确定哪个接口具有连接性,但我希望比等待 ping 超时更快地获得这个。而且我希望不必依赖外部网站正在运行。

更新:

我所有的接口都可能有 IP 地址和网关。这适用于嵌入式设备。所以我们允许用户在eth0eth1 之间进行选择。但如果用户告诉我们使用的界面上没有任何连接,我们会退回说eth2,这(理论上)将始终有效。

所以我需要做的是首先检查用户的选择是否已连接,如果是则返回该 IP。否则我需要得到eth2的ip。我可以很好地获取接口的 IP,它只是确定实际连接的是哪个接口。

【问题讨论】:

  • 什么将接口归类为“关闭”?它不会有网关吗?会不会有网关,但是网关不可达?
  • 您真的无法仅通过查看 IP 来确定路由。不止一个接口可以路由到互联网(例如有线和无线)。它们中没有一个可以(直接)路由到互联网,但可能在处理某些流量的路径中有代理。
  • 除非您使用 ICMP、TCP/IP、UDP 等与 Internet 中的某个服务器建立连接,否则不存在与 Internet 的连接。除非您与某些服务交谈并获得回复,否则您不能说您已连接到 Internet。
  • 我认为你在这里使用了错误的工具——如果你有三个到互联网的连接,你通常会通过绑定连接来解决这个问题,这样你的最快连接服务首先请求并且作为它耗尽了您溢出到其他接口的带宽。如果任何接口死机,您会自动卸载到剩余的接口。如果您阅读 iptables/routing linux 文档,您会发现比每隔几分钟尝试测试一次(如果您仍然“启动”)更可靠的解决方案。
  • 这不是我们正在做的。我们的 eth2 是一个 ppp 连接,只有在其他 2 个没有启动时才应该使用它。

标签: python linux networking ip-address


【解决方案1】:

如果系统的默认网关是可靠的,那么从route -n 的输出中获取包含" UG " 的行(注意空格)还将包含网关的IP 和活动接口的接口名称.

【讨论】:

    【解决方案2】:

    解决方案在这里: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()
    
    

    【讨论】:

    • 有人投了反对票...如果他们愿意发表评论,这将有助于我理解我的错误!!!
    • 发帖者的问题更抽象,您发布的代码特别是关于具有“链接”的接口,正如发帖者所说,每个接口都可能有链接,但可能无法访问互联网。
    猜你喜欢
    • 2011-01-18
    • 2011-02-15
    • 2010-11-17
    • 2012-03-15
    • 2013-07-28
    • 2013-12-23
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    相关资源
    最近更新 更多