在 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
。它可能被命名为 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。
我的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
。它可能被命名为 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。