我的目标是编写一个Python脚本,为用户提供一系列特定设备的链接本地IPv6地址。我的技术是发出多播ping,然后使用邻居发现来获取地址列表,然后我可以过滤掉。
第一步是:
output = subprocess.check_output(['ping6', '-c', '2', 'ff02::1%en0'])
问题是最后一词 en0 。这不是一个常数。在MacOS上,它是 en0 ,但在Linux上它将是 eth0 或可能 br0 。 Windows有不同的命令,但同样的问题。如果没有界面限定符,则 ping6 命令不起作用。
此外,某些系统可能有多个接口。
那么Python脚本如何获得这些接口的列表?
或者,可以使用套接字包而不是子流程来完成吗? (我不希望我的脚本需要特权模式,并使用 ping 来解决这个问题。)
答案 0 :(得分:1)
在Linux下,无法保证您的第一个以太网接口将被命名为eth0
。它可能被命名为p1s3
或em1
或甚至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。