TA的每日心情 | 慵懒 3 小时前 |
---|
签到天数: 94 天 [LV.6]常住居民II
|
本帖最后由 微尘 于 2025-9-13 01:20 编辑
分享一个可以修改IPV4和IPV6的程序,只支持Linux操作系统修改ip,windows只能运行不能修改ip。windows用户可在虚拟机内运行。
import netifaces
import platform
import ipaddress # 新增:用于校验IP合法性
try:
from pyroute2 import IPDB
except ImportError:
IPDB = None
# 新增:点分十进制子网掩码转CIDR前缀
def 掩码转CIDR(点分掩码):
try:
# 将点分掩码拆分为4段,转二进制后补零为8位,再拼接成完整二进制字符串
二进制 = ''.join([bin(int(段))[2:].zfill(8) for 段 in 点分掩码.split('.')])
# 移除末尾的0,剩余长度即为CIDR前缀
return len(二进制.rstrip('0'))
except:
# 若输入无效(如非点分格式、数值超0-255),返回None
return None
# 新增:校验IPv4地址合法性
def 校验IPv4(IPv4地址):
try:
ipaddress.IPv4Address(IPv4地址)
return True
except ipaddress.AddressValueError:
return False
# 获取网络接口
def 获取网络接口():
try:
return netifaces.interfaces()
except Exception as e:
print(f"获取网络接口失败:{e}")
exit(1)
# 获取当前IPv4地址
def 获取当前IPv4地址(接口):
try:
地址信息 = netifaces.ifaddresses(接口)
if netifaces.AF_INET in 地址信息:
return 地址信息[netifaces.AF_INET][0]['addr']
return "未配置"
except Exception as e:
return f"获取失败:{str(e)[:20]}"
# 获取当前IPv6地址(优化:优先返回全球单播地址)
def 获取当前IPv6地址(接口):
try:
地址信息 = netifaces.ifaddresses(接口)
if netifaces.AF_INET6 in 地址信息:
for 地址 in 地址信息[netifaces.AF_INET6]:
纯地址 = 地址['addr'].split('%')[0] # 移除接口标识(如%eth0)
# 仅保留全球单播地址(2000::/3),排除链路本地、回环等
if ipaddress.IPv6Address(纯地址).is_global:
return 纯地址
# 若无全球单播地址,返回其他非链路本地地址
for 地址 in 地址信息[netifaces.AF_INET6]:
纯地址 = 地址['addr'].split('%')[0]
if not 纯地址.startswith('fe80::') and 纯地址 != '::1':
return 纯地址
return "未配置"
except Exception as e:
return f"获取失败:{str(e)[:20]}"
# 修改后:设置IPv4地址(接收CIDR前缀,增加异常捕获)
def 设置IPv4地址(接口, 新IPv4地址, cidr前缀):
系统 = platform.system()
if 系统 != 'Linux':
print("仅Linux系统支持IPv4地址配置")
return
if IPDB is None:
print("未安装pyroute2库(需执行:pip install pyroute2)")
return
if not (0 <= cidr前缀 <= 32):
print("CIDR前缀无效(需0-32之间)")
return
try:
with IPDB() as ipdb:
# 检查接口是否存在
if 接口 not in ipdb.interfaces:
print(f"网络接口{接口}不存在")
return
# 配置IP并启用接口
with ipdb.interfaces[接口] as 网卡:
网卡.add_ip(f'{新IPv4地址}/{cidr前缀}')
网卡.up()
print(f"成功在{接口}上添加IPv4:{新IPv4地址}/{cidr前缀}(注:未替换原有IP)")
except PermissionError:
print("权限不足!需用sudo运行脚本(如:sudo python 脚本名.py)")
except Exception as e:
print(f"配置失败:{str(e)[:50]}")
# 设置IPv6地址(保留原逻辑,增加异常捕获)
def 设置IPv6地址(接口, 新IPv6地址, 前缀长度):
系统 = platform.system()
if 系统 != 'Linux':
print("仅Linux系统支持IPv6地址配置")
return
if IPDB is None:
print("未安装pyroute2库(需执行:pip install pyroute2)")
return
if not (0 <= int(前缀长度) <= 128):
print("IPv6前缀长度无效(需0-128之间)")
return
if not 校验IPv6(新IPv6地址):
print("IPv6地址格式无效")
return
try:
with IPDB() as ipdb:
if 接口 not in ipdb.interfaces:
print(f"网络接口{接口}不存在")
return
with ipdb.interfaces[接口] as 网卡:
网卡.add_ip(f'{新IPv6地址}/{前缀长度}', family=netifaces.AF_INET6)
网卡.up()
print(f"成功在{接口}上添加IPv6:{新IPv6地址}/{前缀长度}(注:未替换原有IP)")
except PermissionError:
print("权限不足!需用sudo运行脚本(如:sudo python 脚本名.py)")
except Exception as e:
print(f"配置失败:{str(e)[:50]}")
# 新增:校验IPv6地址合法性
def 校验IPv6(IPv6地址):
try:
ipaddress.IPv6Address(IPv6地址.split('%')[0]) # 移除接口标识
return True
except ipaddress.AddressValueError:
return False
if __name__ == '__main__':
print("=== Linux网络接口IP配置工具 ===")
print("注:配置IP需用sudo运行,且仅新增IP(不替换原有IP)\n")
# 1. 选择网络接口(处理输入异常)
接口列表 = 获取网络接口()
print("可用的网络接口:")
for 索引, 接口 in enumerate(接口列表, 1):
print(f'{索引}. {接口}')
while True:
try:
选择序号 = int(input('\n请输入要配置的接口序号:')) - 1
if 0 <= 选择序号 < len(接口列表):
选中的接口 = 接口列表[选择序号]
break
else:
print(f"序号无效!需输入1-{len(接口列表)}之间的数")
except ValueError:
print("输入错误!需输入整数")
# 2. 配置IPv4(增加IP合法性校验+掩码转换)
当前IPv4 = 获取当前IPv4地址(选中的接口)
print(f'\n当前IPv4地址:{当前IPv4}')
新IPv4 = input('请输入新的IPv4地址(留空保持当前):').strip()
if 新IPv4:
if not 校验IPv4(新IPv4):
print("IPv4地址格式无效(如正确格式:192.168.1.6)")
else:
while True:
点分掩码 = input('请输入子网掩码(如255.255.255.0):').strip()
cidr前缀 = 掩码转CIDR(点分掩码)
if cidr前缀 and 0 <= cidr前缀 <= 32:
设置IPv4地址(选中的接口, 新IPv4, cidr前缀)
break
else:
print("子网掩码无效!请输入正确的点分十进制格式(如255.255.255.0)")
# 3. 配置IPv6(增加合法性校验)
当前IPv6 = 获取当前IPv6地址(选中的接口)
print(f'\n当前IPv6地址:{当前IPv6}')
新IPv6 = input('请输入新的IPv6地址(留空保持当前,如2001:db8::1):').strip()
if 新IPv6:
if not 校验IPv6(新IPv6):
print("IPv6地址格式无效(如正确格式:2001:db8::1)")
else:
while True:
try:
前缀长度 = input('请输入IPv6前缀长度(如64,需0-128):').strip()
前缀长度 = int(前缀长度)
if 0 <= 前缀长度 <= 128:
设置IPv6地址(选中的接口, 新IPv6, 前缀长度)
break
else:
print("前缀长度无效!需0-128之间的整数")
except ValueError:
print("输入错误!需输入整数")
print("\n配置流程结束") |
|