如何用脚本批量修改IP地址?

wen 实用脚本 2

如何用脚本批量修改IP地址:运维人员的高效实战指南

目录导读

  1. 为什么需要批量修改IP地址?
  2. 批量修改IP的核心原理
  3. Windows环境下的PowerShell脚本实战
  4. Linux环境下的Shell脚本实战
  5. 跨平台Python脚本方案
  6. 常见问题与解决方案(Q&A)
  7. 安全注意事项与最佳实践

为什么需要批量修改IP地址?

在服务器部署、网络重构或设备迁移时,手动逐台修改IP地址不仅耗时,还容易出错。

如何用脚本批量修改IP地址?

  • 100台新服务器需要配置固定IP
  • 临时调整子网掩码或网关
  • 批量切换DHCP与静态IP模式

一个真实案例:某公司数据中心迁移后,需要将200台服务器从192.168.1.x网段改为10.0.0.x网段,如果手动操作,每人每天最多完成30台,且配置错误率高达8%,而通过脚本自动化,2小时内完成全部修改,错误率为零。


批量修改IP的核心原理

无论使用哪种脚本语言,核心操作都是:

  1. 获取当前网络配置:识别网卡名称、IP协议版本(IPv4/IPv6)
  2. 解析目标配置:从CSV文件、变量或命令行参数读取新IP、子网掩码、网关、DNS
  3. 执行修改命令:调用操作系统提供的网络配置工具(Windows的netsh / Linux的ifconfig / nmcli
  4. 验证与回滚:修改后测试连通性,失败时自动恢复原始配置

关键概念:脚本批量处理时,建议使用“原子化操作”——每台设备配置完成后立即验证,避免批量失败导致大面积网络中断。


Windows环境下的PowerShell脚本实战

1 基础单台修改命令

# 修改本地连接为静态IP
New-NetIPAddress -InterfaceAlias "以太网" -IPAddress 192.168.1.100 -PrefixLength 24 -DefaultGateway 192.168.1.1
Set-DnsClientServerAddress -InterfaceAlias "以太网" -ServerAddresses ("8.8.8.8","1.1.1.1")

2 批量脚本(读取CSV文件)

$computers = Import-Csv "C:\IP_List.csv"  # 包含ComputerName,IP,SubnetMask,Gateway,DNS列
foreach ($computer in $computers) {
    try {
        Invoke-Command -ComputerName $computer.ComputerName -ScriptBlock {
            param($IP, $Mask, $GW, $DNS)
            # 获取指定名称的网卡
            $adapter = Get-NetAdapter -Name "以太网" | Where-Object {$_.Status -eq "Up"}
            # 先删除现有IP(如果不保留)
            Remove-NetIPAddress -InterfaceIndex $adapter.ifIndex -Confirm:$false
            # 设置新IP
            New-NetIPAddress -InterfaceIndex $adapter.ifIndex -IPAddress $IP -PrefixLength $Mask -DefaultGateway $GW
            Set-DnsClientServerAddress -InterfaceIndex $adapter.ifIndex -ServerAddresses ($DNS.Split(","))
        } -ArgumentList $computer.IP, $computer.SubnetMask, $computer.Gateway, $computer.DNS
        Write-Host "$($computer.ComputerName) 配置成功"
    } catch {
        Write-Warning "$($computer.ComputerName) 配置失败: $_"
    }
}

3 执行前准备

  • 确保PowerShell执行策略允许运行脚本:Set-ExecutionPolicy RemoteSigned
  • 批量操作前先在单台测试机上验证

Linux环境下的Shell脚本实战

1 基于nmcli的现代方案(CentOS/RHEL 7+、Ubuntu 18.04+)

#!/bin/bash
# 读取IP配置列表文件,格式:接口名称 IP地址 子网掩码 网关 DNS1 DNS2
while IFS=' ' read -r iface ip mask gw dns1 dns2; do
    # 修改为静态IP
    nmcli con mod "$iface" ipv4.addresses "$ip/$mask"
    nmcli con mod "$iface" ipv4.gateway "$gw"
    nmcli con mod "$iface" ipv4.dns "$dns1 $dns2"
    nmcli con mod "$iface" ipv4.method manual
    # 重启网络连接使之生效
    nmcli con down "$iface" && nmcli con up "$iface"
    echo "已配置 $iface -> $ip"
done < /root/ip_config.txt

2 传统ifconfig方案(旧版兼容)

#!/bin/bash
# 适用于较早版本系统
IP_FILE="ip_list.txt"
while IFS=',' read -r dev ip netmask gw; do
    ifconfig $dev down
    ifconfig $dev $ip netmask $netmask
    route add default gw $gw
    ifconfig $dev up
    echo "设备 $dev 已设置为 $ip"
done < $IP_FILE

3 批量检查连通性脚本

#!/bin/bash
# 修改后验证每个IP是否可达(通过ping网关)
ping -c 2 $1 &> /dev/null || echo "IP $1 无法连通网关"

跨平台Python脚本方案

Python的subprocess模块可以统一管理Windows和Linux命令,推荐用于复杂逻辑场景。

核心代码示例

import subprocess
import csv
from typing import Dict
def set_ip_windows(ip_info: Dict):
    """Windows系统修改IP"""
    commands = [
        f'netsh interface ip set address name="以太网" static {ip_info["ip"]} {ip_info["mask"]} {ip_info["gateway"]} 1',
        f'netsh interface ip set dns name="以太网" static {ip_info["dns1"]}',
        f'netsh interface ip add dns name="以太网" addr={ip_info["dns2"]} index=2'
    ]
    for cmd in commands:
        subprocess.run(cmd, shell=True, check=True)
def set_ip_linux(ip_info: Dict):
    """Linux系统修改IP"""
    commands = [
        f'nmcli con mod "System eth0" ipv4.addresses {ip_info["ip"]}/{ip_info["cidr"]}',
        f'nmcli con mod "System eth0" ipv4.gateway {ip_info["gateway"]}',
        f'nmcli con mod "System eth0" ipv4.dns "{ip_info["dns1"]} {ip_info["dns2"]}"',
        'nmcli con down "System eth0"',
        'nmcli con up "System eth0"'
    ]
    for cmd in commands:
        subprocess.run(cmd, shell=True, check=True)
# 读取CSV文件批量处理
with open('ip_batch.csv', 'r') as f:
    reader = csv.DictReader(f)
    for row in reader:
        if sys.platform == 'win32':
            set_ip_windows(row)
        else:
            # 需要将子网掩码转换为CIDR前缀长度
            from ipaddress import IPv4Network
            cidr = IPv4Network(f'0.0.0.0/{row["mask"]}').prefixlen
            row['cidr'] = str(cidr)
            set_ip_linux(row)

常见问题与解决方案(Q&A)

Q1:修改后网络立刻断开,如何避免?
A:使用“冗余配置”——先添加新IP(租期较长),确认成功后删除旧IP,也可以结合atschtasks设置定时回滚。

Q2:脚本执行前如何备份现有配置?
A:Windows:netsh interface ip dump > backup.txt
Linux:ip addr show > backup_ip.txt 或保存/etc/sysconfig/network-scripts/ifcfg-*文件

Q3:远程批量修改时SSH连接中断怎么办?
A:使用nohupscreen保持后台运行;或者编写“先配置新IP,同时保留旧IP几分钟”的逻辑,通过心跳验证切换。

Q4:如何验证所有设备修改成功?
A:生成一个验证脚本,从每个目标IP的指定端口(如22/3389)发起连接测试,或扫描预期网段的ARP表确认。

Q5:子网掩码格式问题(255.255.255.0 vs /24)
A:不同工具需要对应格式,powerShell和nmcli建议使用CIDR格式(/24),netsh使用点分十进制。


安全注意事项与最佳实践

  1. 最小权限原则:脚本不应使用管理员/root身份运行,除非必须,对普通用户可使用sudo精细授权。
  2. 配置验证:在脚本中加入pingcurl测试网关,避免配置错误造成中断。
  3. 日志记录:所有操作写入日志文件,包括时间戳、设备名、新旧IP、结果状态。
  4. 分批执行:将设备分组(如每次20台),组间间隔30秒,防止网络风暴。
  5. 版本控制:IP配置列表(CSV/TXT)放入Git仓库,方便回溯和审计。

生产环境建议流程

备份当前配置 -> 创建IP配置列表 -> 在测试环境验证脚本 -> 
分批执行(前5台人工确认)-> 全量执行 -> 自动化验证 -> 提交配置报告

通过脚本批量修改IP地址,不仅提升了运维效率,更实现了“配置即代码”的运维理念,无论是维护传统数据中心还是云端混合网络,掌握这项技能都能让网络管理员从重复劳动中解放出来,建议根据实际环境从PowerShell或Shell脚本入手,逐步过渡到跨平台Python方案,最终形成标准化的自动化配置工具链。

抱歉,评论功能暂时关闭!