在 Mac OS 下查找活动的 IPv6 接口(使用 Python)

Finding active IPv6 interfaces under Mac OS (using Python)

我的objective是写一个Python脚本,为用户提供一系列link-特定设备的本地IPv6地址。我的技术是发送一个多播 ping,然后使用邻居发现来获取一个地址列表,然后我可以对其进行过滤。

第一步是这样的:

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

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

另外,一些系统可能有多个接口。

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

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

在 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。