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

时间:2015-06-08 20:55:23

标签: python linux macos ipv6

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

第一步是:

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

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

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

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

或者,可以使用套接字包而不是子流程来完成吗? (我不希望我的脚本需要特权模式,并使用 ping 来解决这个问题。)

1 个答案:

答案 0 :(得分: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。