微尘 发表于 2025-9-13 10:03:55

ip修改器

本帖最后由 微尘 于 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(.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 地址信息['addr']
      return "未配置"
    except Exception as e:
      return f"获取失败:{str(e)[:20]}"


# 获取当前IPv6地址(优化:优先返回全球单播地址)
def 获取当前IPv6地址(接口):
    try:
      地址信息 = netifaces.ifaddresses(接口)
      if netifaces.AF_INET6 in 地址信息:
            for 地址 in 地址信息:
                纯地址 = 地址['addr'].split('%')# 移除接口标识(如%eth0)
                # 仅保留全球单播地址(2000::/3),排除链路本地、回环等
                if ipaddress.IPv6Address(纯地址).is_global:
                  return 纯地址
            # 若无全球单播地址,返回其他非链路本地地址
            for 地址 in 地址信息:
                纯地址 = 地址['addr'].split('%')
                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('%'))# 移除接口标识
      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配置流程结束")

微尘 发表于 2025-9-13 10:07:54

本帖最后由 微尘 于 2025-9-12 17:09 编辑

需安装netifaces库(用于网络接口查询),若在Linux下修改IP,还需安装pyroute2(用命令pip install pyroute2安装)。
在Linux下修改IP/IPv6地址,需要以管理员权限(如sudo)运行脚本

微尘 发表于 2025-9-13 10:25:29

错误修改IP可能导致网络连接中断,建议先把自己IPV4和IPV6地址记下来再使用。

H.U.C清风 发表于 2025-9-20 13:31:43

谢谢分享,已回复。
页: [1]
查看完整版本: ip修改器