设为首页收藏本站
查看: 101|回复: 7

ip修改器

[复制链接]
  • TA的每日心情
    慵懒
    1 小时前
  • 签到天数: 94 天

    [LV.6]常住居民II

    发表于 2025-9-13 10:03:55 | 显示全部楼层 |阅读模式
    本帖最后由 微尘 于 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配置流程结束")

    点评

    支持一下  发表于 前天 13:30
    谢谢分享  发表于 前天 13:29
  • TA的每日心情
    慵懒
    1 小时前
  • 签到天数: 94 天

    [LV.6]常住居民II

     楼主| 发表于 2025-9-13 10:07:54 | 显示全部楼层
    本帖最后由 微尘 于 2025-9-12 17:09 编辑

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

    点评

    支持一下  发表于 昨天 15:22
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    1 小时前
  • 签到天数: 94 天

    [LV.6]常住居民II

     楼主| 发表于 2025-9-13 10:25:29 来自手机 | 显示全部楼层
    错误修改IP可能导致网络连接中断,建议先把自己IPV4和IPV6地址记下来再使用。

    点评

    哈哈哈哈  发表于 前天 13:33
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 14:01
  • 签到天数: 638 天

    [LV.9]以坛为家II

    发表于 前天 13:31 | 显示全部楼层
    谢谢分享,已回复。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    红盟社区--红客联盟 

    Processed in 0.063333 second(s), 22 queries.

    站点统计| 举报| Archiver| 手机版| 黑屋 |   

    备案号:冀ICP备20006029号-1 Powered by HUC © 2001-2021 Comsenz Inc.

    手机扫我进入移动触屏客户端

    关注我们可获取更多热点资讯

    Honor accompaniments. theme macfee

    快速回复 返回顶部 返回列表