【问题标题】:Finding active IPv6 interfaces under Mac OS (using Python)在 Mac OS 下查找活动的 IPv6 接口(使用 Python)
【发布时间】:2015-06-08 20:55:22
【问题描述】:

我的目标是编写一个 Python 脚本,为用户提供一系列特定设备的链接本地 IPv6 地址。我的技术是发送多播 ping,然后使用邻居发现来获取地址列表,然后我可以过滤掉。

第一步是这样的:

output = subprocess.check_output(['ping6', '-c', '2', 'ff02::1%en0'])

问题在于末尾的 en0 一词。它不是一个常数。在 MacOS 上是 en0,但在 Linux 上是 eth0 或者可能是 br0。 Windows 有不同的命令但同样的问题。如果没有接口限定符,ping6 命令将不起作用。

此外,某些系统可能有多个接口。

那么 Python 脚本如何获取这些接口的列表呢?

或者,这可以通过使用 socket 包而不是 subprocess 来完成吗? (我不希望我的脚本需要特权模式,而使用 ping 可以解决这个问题。)

【问题讨论】:

    标签: python linux macos ipv6


    【解决方案1】:

    在 Linux 下,无法保证您的第一个以太网接口将被命名为 eth0。它可能被命名为p1s3em1 甚至internal。或bob

    在 Linux 和 OS X 下,您都可以使用 netifaces python 模块来获取可用接口的列表与这些接口关联的地址。例如,考虑以下代码:

    import netifaces
    
    for iface in netifaces.interfaces():
        addrs = netifaces.ifaddresses(iface)
        for addr in addrs.get(netifaces.AF_INET6, []):
            print '%-8s %s' % (iface, addr['addr'])
    

    在我的 Linux 系统上产生的:

    lo       ::1
    enp0s25  fe80::3e97:eff:febf:6dce%enp0s25
    docker0  fe80::d8d1:31ff:feb2:b6c6%docker0
    br-ext   fe80::f879:f3ff:fe6b:f445%br-ext
    lxcbr0   fe80::fc45:6bff:fefd:543%lxcbr0
    vethf8c98b2 fe80::a0a7:3bff:feff:4f9b%vethf8c98b2
    vnet0    fe80::fc54:ff:fee5:2818%vnet0
    

    在我的 OS X 系统上产生:

    lo0      ::1
    lo0      fe80::1%lo0
    en3      fe80::e2f8:47ff:fe41:866a%en3
    

    我不知道这是否适用于 Windows。

    【讨论】:

    • 哇,这看起来不错。明天我会试一试,让你知道它是如何工作的。我担心我不得不求助于解析 netstat 的输出或其他东西。
    • 这看起来至少是我为 MacOS 和 Linux 找到的最佳解决方案。在 Windows 下,接口由 UUID 字符串表示,我想它可以以某种方式转换为 Windows 使用的接口索引。
    猜你喜欢
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 2016-06-12
    • 1970-01-01
    • 2011-05-10
    • 2011-08-21
    相关资源
    最近更新 更多