如何在Linux系统下获取接口的IPv6地址

3
你知道如何在Python2.6中获取我其中一个接口的IPv6地址吗?我尝试使用套接字模块,但没有成功。谢谢。
6个回答

5

使用netifaces模块即可。

import netifaces
addrs = netifaces.ifaddresses('eth0')
addrs[netifaces.AF_INET6][0]['addr']

非常感谢,但遗憾的是我想在这个脚本中保持简单,以便在许多不同的环境中运行。因此,我正在寻找一些不需要 easy_install 的东西。 但仍然非常感谢,它工作得很好。 - jaes

0

0
这是对OP答案的重构,将其转换为单个子进程。我不得不猜测一些关于ip输出格式的事情。
output = subprocess.run(
    ['ip','addr','show','br0'],
    text=True, check=True, capture_output=True)
for line in output.stdout.splitlines() 
:
    if "inet6" in line:
        if "fe80" not in line:
            addr = line.split("inet6")[1].strip()
            addr = addr.split("/64")[0]
print(addr)

通常来说,简单的搜索和字符串替换操作在Python中直接执行既更容易又更快速。如果可以的话,你应该避免运行超过一个子进程。(当然,如果你能够完全使用Python本身实现所有功能,则最好不过。)


0
你可以使用 subprocess.* 调用运行 'ifconfig' 命令并解析输出。

我考虑过这个问题,实际上我已经有一个就获取我的IPv6格式化良好的命令了(而且很长)。但是它看起来真的很丑。一定有更好的方法来做到这一点。 - jaes

0
使用psutil来回答:
import psutil
import socket

def get_ipv6_address_from_nic(interface):
    interface_addrs = psutil.net_if_addrs().get(interface) or []
    for snicaddr in interface_addrs:
        if snicaddr.family == socket.AF_INET6:
            return snicaddr.address

例子:

>>> get_ipv6_address_from_nic("lo")
'::1'

-6

我肯定会选择这个,它应该能够很好地工作,即使我发现它真的很丑陋。

step1 = Popen(['ip','addr','show','br0'],stdout=PIPE)
step2 = Popen(['grep','inet6'],stdout=PIPE,stdin=step1.stdout)
step3 = Popen(['sed','-e','/fe80/d','-e','s/ *inet6 *//g','-e','s/\/64.*$//g'],stdout=PIPE,stdin=step2.stdout)
step4 = Popen(['tail','-n1'],stdout=PIPE,stdin=step3.stdout)
step4.communicate()[0]

再次感谢您的帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接