Ubuntu 22.04 with Python 有没有办法自动检测本机IPv6地址?
时间: 2025-06-17 20:28:15 浏览: 19
### 自动获取本机 IPv6 地址的 Python 方法
在 Ubuntu 22.04 系统中,通过 Python 获取本机的 IPv6 地址可以通过多种方式实现。以下是基于 `socket` 和 `psutil` 库的一种方法。
#### 使用 socket 模块
Python 的标准库 `socket` 提供了一种简单的方式来枚举网络接口及其关联的 IP 地址。以下是一个示例代码:
```python
import socket
import fcntl
import struct
import array
def get_ipv6_addresses():
addresses = []
try:
max_possible = 128 # arbitrary. raise if needed.
bytes_sockaddr = max Possible * 16 # assume at least 2 bytes per address (likely overkill)
s = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
names = array.array('B', b'\0' * bytes_sockaddr)
outbytes = struct.unpack('iL', fcntl.ioctl(
s.fileno(),
0x8912, # SIOCGIFCONF
struct.pack('iL', bytes_sockaddr, names.buffer_info()[0])
))[0]
namestr = names.tostring()
for i in range(0, outbytes, 40):
name = namestr[i:i+16].split(b'\0', 1)[0]
addr = namestr[i+20:i+36]
if any(c != '\0' for c in addr): # skip empty addresses
ip = ":".join(["%02x%02x" % (ord(addr[j]), ord(addr[j+1])) for j in range(0, 16, 2)])
addresses.append(ip.decode())
except Exception as e:
pass # handle exceptions or log errors here
return addresses
ipv6_addrs = get_ipv6_addresses()
print(f"Detected IPv6 Addresses: {ipv6_addrs}")
```
此代码利用了 Linux 特有的 ioctl 调用来读取网络接口信息并解析其中的 IPv6 地址[^1]。
#### 使用 psutil 模块
另一种更简洁的方式是借助第三方模块 `psutil` 来完成相同的功能。安装该模块后,可以轻松访问系统的网络接口详情。
首先需要安装 `psutil`:
```bash
pip install psutil
```
接着编写如下脚本:
```python
import psutil
def fetch_ipv6_addresses():
addrs = psutil.net_if_addrs() # Get all network interfaces and their details
ipv6_list = []
for interface_name, snics in addrs.items():
for snic in snics:
if snic.family.name == 'AF_INET6': # Check if the family is IPv6
ipv6_list.append(snic.address)
return ipv6_list
detected_ips = fetch_ipv6_addresses()
print(f"Found IPv6 Addresses: {detected_ips}")
```
这段程序会遍历所有的网卡,并筛选出属于 AF_INET6 类型的家庭地址,从而提取有效的 IPv6 地址列表[^2]。
#### 注意事项
- 如果机器上有多个活动的网络适配器,则可能会返回不止一个 IPv6 地址。
- 对于某些虚拟环境或者容器化部署场景下,可能仅存在回环设备 lo 的链接本地范围内的唯一标识符(Link-local Unique Identifier),形如 fe80::/10 开头的形式。
- 当前主机未启用 IPv6 支持时,上述两种方法均不会找到任何有效记录。
阅读全文