Python跨平台IP配置工具(Windows/Linux通用)完整源码+使用教程

发布时间:2026/9/1 23:34:58

Python跨平台IP配置工具(Windows/Linux通用)完整源码+使用教程
一、前言日常运维、局域网调试、多网络环境切换场景下手动修改电脑IP地址、子网掩码、网关、DNS十分繁琐且Windows、Linux系统配置命令不统一新手极易操作出错。为此我用Python开发了一款跨平台智能IP配置工具无需手动输入系统命令自动识别操作系统、读取网卡信息、展示当前网络配置支持一键设置静态IP、一键切换DHCP自动获取IP完美兼容Windows、Linux、MacOS系统适配中英文系统环境解决编码报错、网卡识别失败等常见问题。工具全程开源无依赖、轻量化运行适合个人日常使用、批量设备运维、学习Python系统运维开发。二、工具核心功能跨平台适配完美支持 Windows、Linux、MacOSDarwin系统智能网卡识别自动扫描系统所有可用网络适配器兜底适配常见网卡名称编码兼容处理优先GBK、兼容UTF-8解码解决中英文系统乱码问题配置读取一键获取网卡当前IP、子网掩码、默认网关信息静态IP配置自定义IP、子网掩码、网关、DNS服务器支持可选配置DHCP自动切换一键恢复自动获取IP和DNS还原网络默认配置权限检测自动判断管理员/root权限避免配置失败格式转换内置CIDR与子网掩码双向转换适配各类网络配置场景日志调试模式开启debug可查看底层执行命令方便问题排查三、运行环境要求Python版本Python3.6及以上全版本兼容系统权限必须以管理员/root权限运行修改网络配置需要系统最高权限依赖库纯原生库无需额外pip安装subprocess、platform、re等均为Python内置库编码格式文件默认GBK编码适配Windows系统兼容Linux UTF-8编码四、完整开源源码直接复制以下代码保存为ip_config_tool.py即可运行。#!/usr/bin/env python # -*- coding: gbk -*- # 上面的编码声明根据你的文件实际编码修改通常Windows系统用gbk或cp936 import subprocess import platform import re import getpass from typing import Dict, List, Optional class IPConfigurator: def __init__(self, debugFalse): self.os_type platform.system() self.debug debug self.adapters self.get_network_adapters() def decode_output(self, output_bytes) - str: 智能解码字节数据优先尝试GBK再尝试UTF-8 try: return output_bytes.decode(gbk) except UnicodeDecodeError: try: return output_bytes.decode(utf-8) except UnicodeDecodeError: return output_bytes.decode(gbk, errorsignore) def get_network_adapters(self) - List[str]: 获取网络适配器列表改进编码处理 adapters [] try: if self.os_type Windows: result subprocess.run( [netsh, interface, show, interface], capture_outputTrue, textFalse, # 捕获字节数据 checkTrue ) stdout self.decode_output(result.stdout) stderr self.decode_output(result.stderr) if self.debug: print(\n 网络适配器原始字节解码后 ) print(stdout) print(\n) if result.returncode ! 0: print(f命令执行错误: {stderr}) return adapters lines stdout.splitlines() # 多种模式匹配适配器兼容不同语言/格式 patterns [ re.compile(r已连接\s\d\s\w\s(.*), re.IGNORECASE), re.compile(r\s\d\s\w\s(.*), re.IGNORECASE), re.compile(r本地连接|以太网|WLAN|无线|Network, re.IGNORECASE) ] for line in lines: line line.strip() if not line: continue for pattern in patterns: match pattern.search(line) if match: adapter match.group(1).strip() if len(match.groups()) 0 else line.strip() if adapter and adapter not in adapters: adapters.append(adapter) break elif self.os_type in [Linux, Darwin]: result subprocess.run( [ip, link, show], capture_outputTrue, textFalse, checkTrue ) stdout self.decode_output(result.stdout) if self.debug: print(\n 网络适配器原始字节解码后 ) print(stdout) print(\n) pattern re.compile(r^\d: (\w):) for line in stdout.splitlines(): match pattern.match(line) if match and not match.group(1).startswith(lo): adapters.append(match.group(1)) except Exception as e: print(f获取网络适配器时出错: {str(e)}) # 兜底尝试常见适配器名 if not adapters and self.os_type Windows: common_adapters [以太网, 本地连接, WLAN, 无线网络连接, Ethernet, Wi-Fi] for adapter in common_adapters: try: test subprocess.run( [netsh, interface, show, interface, adapter], capture_outputTrue, textFalse, checkFalse ) if test.returncode 0: adapters.append(adapter) except: continue return adapters def get_current_ip_config(self, adapter: str) - Dict[str, str]: 获取指定适配器的当前IP配置改进编码处理 config {} try: if self.os_type Windows: result subprocess.run( [netsh, interface, ipv4, show, addresses, adapter], capture_outputTrue, textFalse, checkTrue ) stdout self.decode_output(result.stdout) if self.debug: print(f\n {adapter} 的IP配置原始字节解码后 ) print(stdout) print(\n) for line in stdout.splitlines(): line line.strip() if IP 地址 in line or IP Address in line: parts line.split(:, 1) if len(parts) 2: config[ip] parts[1].strip() elif 子网前缀 in line or Subnet Prefix in line: parts line.split(/, 1) if len(parts) 2: mask parts[1].split()[0].strip() config[subnet] self.cidr_to_subnet(mask) elif 默认网关 in line or Default Gateway in line: parts line.split(:, 1) if len(parts) 2: config[gateway] parts[1].strip() elif self.os_type in [Linux, Darwin]: result subprocess.run( [ip, addr, show, adapter], capture_outputTrue, textFalse, checkTrue ) stdout self.decode_output(result.stdout) ip_match re.search(rinet (\d\.\d\.\d\.\d)/(\d), stdout) if ip_match: config[ip] ip_match.group(1) config[subnet] self.cidr_to_subnet(ip_match.group(2)) gateway_result subprocess.run( [ip, route, show, dev, adapter], capture_outputTrue, textFalse, checkFalse ) gateway_stdout self.decode_output(gateway_result.stdout) gateway_match re.search(rvia (\d\.\d\.\d\.\d), gateway_stdout) if gateway_match: config[gateway] gateway_match.group(1) except Exception as e: print(f获取IP配置失败: {str(e)}) return config def cidr_to_subnet(self, cidr: str) - str: 将CIDR表示法转换为子网掩码 try: cidr_int int(cidr) if cidr_int 0 or cidr_int 32: return 255.255.255.0 mask (0xFFFFFFFF (32 - cidr_int)) 0xFFFFFFFF return ..join(map(str, [(mask 24) 0xFF, (mask 16) 0xFF, (mask 8) 0xFF, mask 0xFF])) except: return 255.255.255.0 def set_static_ip(self, adapter: str, ip: str, subnet: str, gateway: Optional[str] None, dns: Optional[List[str]] None) - bool: 设置静态IP地址 try: if self.os_type Windows: commands [ [netsh, interface, ipv4, set, addresses, adapter, static, ip, subnet] ] if gateway: commands.append([ netsh, interface, ipv4, set, gateway, adapter, gateway, 1 ]) if dns: dns_servers .join(dns) commands.append([ netsh, interface, ipv4, set, dnsservers, adapter, static, dns_servers, primary ]) elif self.os_type Linux: commands [ [ip, addr, flush, dev, adapter], [ip, addr, add, f{ip}/{self.subnet_to_cidr(subnet)}, dev, adapter], [ip, link, set, adapter, up] ] if gateway: commands.append([ip, route, add, default, via, gateway, dev, adapter]) if dns: with open(/etc/resolv.conf, w) as f: for server in dns: f.write(fnameserver {server}\n) for cmd in commands: if self.debug: print(f执行命令: { .join(cmd)}) result subprocess.run( cmd, capture_outputTrue, textFalse, # 捕获字节 checkFalse ) stdout self.decode_output(result.stdout) stderr self.decode_output(result.stderr) if result.returncode ! 0: print(f命令执行失败: { .join(cmd)}) print(f错误信息: {stderr}) return False return True except Exception as e: print(f设置静态IP失败: {str(e)}) return False def set_dhcp(self, adapter: str) - bool: 设置为自动获取IP(DHCP) try: if self.os_type Windows: subprocess.run( [netsh, interface, ipv4, set, addresses, adapter, dhcp], capture_outputTrue, textFalse, checkTrue ) subprocess.run( [netsh, interface, ipv4, set, dnsservers, adapter, dhcp], capture_outputTrue, textFalse, checkTrue ) elif self.os_type Linux: subprocess.run( [dhclient, adapter], capture_outputTrue, textFalse, checkTrue ) return True except subprocess.CalledProcessError as e: stderr self.decode_output(e.stderr) print(f设置DHCP失败: {stderr}) return False def subnet_to_cidr(self, subnet: str) - str: 将子网掩码转换为CIDR表示法 try: octets list(map(int, subnet.split(.))) if len(octets) ! 4: return 24 binary .join([f{o:08b} for o in octets]) cidr len(binary.rstrip(0)) return str(cidr if cidr 0 else 0) except: return 24 def is_admin(self) - bool: 检查是否具有管理员权限 try: if self.os_type Windows: return subprocess.run( [fltmc], capture_outputTrue, textFalse ).returncode 0 else: return getpass.getuser() root except: return False def main(): print( IP地址配置工具 ) try: configurator IPConfigurator(debugTrue) if not configurator.is_admin(): print(错误: 此工具需要管理员/root权限才能运行) print(请使用管理员权限重新运行程序。) return print(f检测到操作系统: {configurator.os_type}) print(\n可用的网络适配器:) for i, adapter in enumerate(configurator.adapters, 1): print(f {i}. {adapter}) if not configurator.adapters: print(\n未找到可用的网络适配器) print(可能的解决方法:) print(1. 确认网络适配器已启用并正常工作) print(2. 尝试在命令提示符中执行 netsh interface show interface 查看适配器信息) print(3. 检查是否有足够的系统权限) return try: adapter_idx int(input(\n请选择要配置的适配器编号: )) - 1 if adapter_idx 0 or adapter_idx len(configurator.adapters): print(无效的适配器编号) return selected_adapter configurator.adapters[adapter_idx] except ValueError: print(请输入有效的数字) return print(f\n适配器 {selected_adapter} 的当前配置:) current_config configurator.get_current_ip_config(selected_adapter) print(f IP地址: {current_config.get(ip, 未设置)}) print(f 子网掩码: {current_config.get(subnet, 未设置)}) print(f 网关: {current_config.get(gateway, 未设置)}) print(\n请选择操作:) print( 1. 设置静态IP地址) print( 2. 切换为自动获取IP(DHCP)) try: choice int(input(请输入操作编号: )) if choice 1: ip input(请输入IP地址: ) subnet input(请输入子网掩码: ) gateway input(请输入网关(可选直接回车跳过): ) or None dns_input input(请输入DNS服务器(多个用空格分隔可选): ) dns dns_input.split() if dns_input else None print(f\n正在设置静态IP...) success configurator.set_static_ip( selected_adapter, ip, subnet, gateway, dns ) if success: print(IP配置已更新) new_config configurator.get_current_ip_config(selected_adapter) print(f IP地址: {new_config.get(ip, 未设置)}) print(f 子网掩码: {new_config.get(subnet, 未设置)}) print(f 网关: {new_config.get(gateway, 未设置)}) elif choice 2: print(\n正在切换为自动获取IP...) success configurator.set_dhcp(selected_adapter) if success: print(已切换为自动获取IP(DHCP)) else: print(无效的操作编号) except ValueError: print(请输入有效的数字) except Exception as e: print(f操作失败: {str(e)}) except Exception as e: print(f程序运行出错: {str(e)}) if __name__ __main__: main()五、核心代码模块解析1. 智能解码模块解决Windows中英文系统、Linux跨系统执行命令乱码问题优先GBK解码失败自动切换UTF-8兜底忽略错误字符适配所有系统编码场景。2. 网卡自动识别模块通过系统原生命令扫描网卡搭配正则多模式匹配兼容中英文系统网卡名称新增兜底匹配规则避免网卡识别为空的问题。3. 网络配置读取模块调用系统原生网络查询命令精准解析IP、子网前缀、网关信息自动完成CIDR与子网掩码转换统一输出标准化配置信息。4. 静态IP/DHCP配置模块根据操作系统自动适配不同配置命令Windows基于netsh命令、Linux基于ip命令支持自定义DNS、网关可选配置一键切换静态/动态IP模式。5. 权限检测模块Windows通过fltmc命令、Linux通过root用户校验提前检测运行权限规避权限不足导致的配置失败问题。六、详细使用教程步骤1准备工作安装Python3环境配置系统环境变量将源码保存为ip_config_tool.py文件关键右键终端/命令提示符选择「以管理员身份运行」步骤2运行工具进入文件所在目录执行运行命令python ip_config_tool.py步骤3选择网卡设备程序自动扫描并列出所有可用网卡输入对应编号选择需要配置的网络适配器以太网、WLAN无线网卡等。步骤4查看当前网络配置选中网卡后工具自动展示当前IP、子网掩码、网关配置方便对比修改前后差异。步骤5执行配置操作选项1设置静态IP依次输入自定义IP、子网掩码、网关可选、DNS可选回车自动配置选项2切换DHCP一键恢复系统自动获取IP和DNS还原默认网络配置七、常见问题与解决方案1. 程序提示权限不足解决方案必须以管理员/root权限运行终端普通用户无法修改系统网络配置。2. 未扫描到网络适配器解决方案确认网卡已启用、网络驱动正常可手动核对系统网卡名称工具自带常见网卡兜底适配。3. 配置IP后网络无法联网解决方案检查IP、子网掩码、网关是否匹配局域网网段DNS服务器地址是否有效。4. 运行出现编码报错解决方案Windows保持GBK编码Linux/Mac可修改文件编码为UTF-8工具自带智能解码兼容。八、工具优势总结零依赖轻量化纯Python原生库无需安装第三方模块开箱即用全平台兼容一套代码适配Windows、Linux、MacOS统一操作逻辑容错性极强智能编码、兜底匹配、权限校验规避90%以上运行报错极简操作交互式可视化操作无需记忆系统网络命令新手零基础上手实用性拉满适配日常调试、运维批量配置、多环境网络切换场景九、拓展方向增加IP合法性校验避免输入无效IP地址添加网络连通性测试ping网关、公网DNS开发GUI可视化界面脱离命令行操作支持批量配置多网卡、批量切换网络配置增加配置保存/加载功能一键切换预设网络方案

相关新闻

[光学原理与应用-600]:激光器 VS 激光通信:全面对比详解

[光学原理与应用-600]:激光器 VS 激光通信:全面对比详解

2026/9/1 23:34:58

激光器 VS 激光通信:全面对比详解〇、先立结论:二者不是同一层级的对手激光器是一个「器件 / 装置」—— 把电能(或其他泵浦能量)转换成相干光的能量转换器;激光通信是一个「系统 / 链路」—— 用激光作为载波来传递信…

小学英语核心必掌握词汇

小学英语核心必掌握词汇

2026/9/1 23:24:57

目录 一、人物与家庭 二、数字(重中之重) 三、颜色 四、动物 五、食物饮料 六、身体部位 七、文具学习 八、时间、星期、月份 九、方位介词(考试高频) 十、常见形容词 十一、常用动词 十二、基础代词 十三、疑问词&a…

HoRain云--CSS 提示工具(Tooltip)

HoRain云--CSS 提示工具(Tooltip)

2026/9/1 23:24:57

本文我们为大家介绍如何使用 HTML 与 CSS 来创建提示工具。 提示工具在鼠标移动到指定元素后触发,先看以下四个实例: 头部显示 右边显示 底部显示 左边显示 基础提示框(Tooltip) 提示框在鼠标移动到指定元素上显示: HTML 代码&#xf…

【单片机课程设计/毕业设计】基于 STM32 或 51 单片机的声光报警智能恒温出水系统设计 基于 STM32 或 51 单片机的手机 APP 远程饮水控制终端设计(024805)

【单片机课程设计/毕业设计】基于 STM32 或 51 单片机的声光报警智能恒温出水系统设计 基于 STM32 或 51 单片机的手机 APP 远程饮水控制终端设计(024805)

2026/9/2 0:35:01

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

【单片机课程设计/毕业设计】基于 STM32 单片机的移动端联动安全监护硬件系统设计 基于 STM32 单片机的跌倒识别与多场景预警终端设计(024705)

【单片机课程设计/毕业设计】基于 STM32 单片机的移动端联动安全监护硬件系统设计 基于 STM32 单片机的跌倒识别与多场景预警终端设计(024705)

2026/9/2 0:35:01

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

【单片机课程设计/毕业设计】基于 ESP8266WiFi 模块的生理数据采集报警平台设计与实现 面向居家健康的单片机体征检测与声光报警系统设计(024105)

【单片机课程设计/毕业设计】基于 ESP8266WiFi 模块的生理数据采集报警平台设计与实现 面向居家健康的单片机体征检测与声光报警系统设计(024105)

2026/9/2 0:35:01

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

【单片机课程设计/毕业设计】基于蓝牙移动端的输液滴速液位温度一体化监护系统设计 单片机控制下 PTC 加热输液辅助监测报警系统设计与实现(024005)

【单片机课程设计/毕业设计】基于蓝牙移动端的输液滴速液位温度一体化监护系统设计 单片机控制下 PTC 加热输液辅助监测报警系统设计与实现(024005)

2026/9/2 0:35:01

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

【单片机课程设计/毕业设计】基于 STM32 或 51 单片机的蓝牙移动端饲喂管控系统设计 基于单片机的时钟驱动智能喂食加水设备设计与实现(023905)

【单片机课程设计/毕业设计】基于 STM32 或 51 单片机的蓝牙移动端饲喂管控系统设计 基于单片机的时钟驱动智能喂食加水设备设计与实现(023905)

2026/9/2 0:35:00

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

拉格朗日乘数法精讲:从约束优化到支持向量机实战

拉格朗日乘数法精讲:从约束优化到支持向量机实战

2026/9/2 0:25:00

1. 背景与核心概念如果你正在学习机器学习,可能在看书或看视频时,突然看到“拉格朗日乘数法”这个词。很多初学者在这里卡住,原因是它前面连着高等数学,后面又连着支持向量机推导,硬啃的话容易劝退。但其实&#xff0c…

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

2026/9/1 1:53:39

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

2026/9/1 9:55:14

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

2026/9/1 23:49:08

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

单片机毕业设计-基于单片机与蓝牙通讯的输液状态监测终端设计与开发 基于 STM32 或 51 单片机的液位‑滴速‑温度多参数输液监护装置设计(024005)

单片机毕业设计-基于单片机与蓝牙通讯的输液状态监测终端设计与开发 基于 STM32 或 51 单片机的液位‑滴速‑温度多参数输液监护装置设计(024005)

2026/9/2 0:04:59

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

DeepSeek字幕翻译实战:从API调用到批量SRT转中文的完整方案

DeepSeek字幕翻译实战:从API调用到批量SRT转中文的完整方案

2026/9/2 0:04:59

这次我们来看一个很实用的 DeepSeek 落地场景:用 DeepSeek 把英文视频字幕自动翻译成中文。具体案例是《恶魔君》1989 年第 28 集的英转中字幕任务,标题写得很直白,但背后其实是一整套可以复用的技术流程:字幕解析、模型调用、批量…

用Python搭建搞笑语音助手:从语音识别到语音合成全教程

用Python搭建搞笑语音助手:从语音识别到语音合成全教程

2026/9/2 0:04:59

当你家里摆着一台天猫精灵,却总希望语音助手偶尔“不正经”一点,不用官方腔回答问题,而是张口就接几句搞笑段子,会是什么体验?我最近动手验证了一下这个想法——没有去改装任何市面上现有的智能音箱,而是直…

远程协作的工作台整理

远程协作的工作台整理

2026/9/1 0:03:36

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/1 0:03:36

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/1 0:03:36

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…