IP地址自动修改实操过程及脚本
2026/9/12 11:53:53 网站建设 项目流程


一、任务概览

项目 内容
任务名称 任务1:修改虚拟机IP地址
任务目标 将虚拟机IP从 192.168.1.41 改为 192.168.1.228
涉及系统/软件 Rocky Linux 8.6 虚拟机,NetworkManager,网络配置
当前阶段 已完成
二、环境信息

2.1 本地环境

项目 值
操作系统 Windows
工作目录 C:\Users\Administrator\Doubao\chats\2026-08-29\new-chat
Shell PowerShell
SSH工具 Posh-SSH 3.2.7(PowerShell模块,本次调试中安装)
Python 3.13.13(pip可用,但paramiko安装失败,原因待查)
2.2 远程/目标环境

项目 值
原IP 192.168.1.41
新IP 192.168.1.228
子网掩码 /24 (255.255.255.0)
网关 192.168.1.1
DNS1 223.5.5.5
DNS2 114.114.114.114
操作系统 Rocky Linux 8.6 (Green Obsidian)
内核版本 4.18.0-372.9.1.el8.x86_64
网卡名 ens33
MAC地址 00:0c:29:35:4e:c2
网卡配置文件 /etc/sysconfig/network-scripts/ifcfg-ens33
网络管理 NetworkManager(nmcli)
登录凭据 root / root@1234
三、调试日志

按时间正序记录,每条包含:时间、操作、命令、输出/现象、分析、结论。
2026-08-29 初始化

操作:创建调试工作文档,确立记录规范。

说明:本文档将持续追加所有调试过程的重要内容。

2026-08-29 任务1:修改虚拟机IP地址

阶段1:本地SSH工具准备

问题:本地Windows环境没有ssh命令,也没有plink、sshpass等工具。

ssh -V 2>&1
→ ssh : The term 'ssh' is not recognized...
尝试1:用pip安装paramiko(Python SSH库),失败。

pip install paramiko -q
→ 超时/失败(exit code -1)

pip install paramiko -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
→ 仍然失败(exit code -1)
尝试2:用PowerShell安装Posh-SSH模块,首次失败。

Install-Module -Name Posh-SSH -Force -Scope CurrentUser
→ Install-NuGetClientBinaries : Exception calling "ShouldContinue" with "2" argument(s):
"Windows PowerShell is in NonInteractive mode. Read and Prompt functionality is not available."
根因:NonInteractive模式下,NuGet提供者安装需要交互确认。

解决方案:先强制安装NuGet提供者,再信任PSGallery,最后安装模块。

Install-PackageProvider -Name NuGet -Force -Scope CurrentUser
Set-PSRepository -Name PSGallery -InstallationPolicy Trusted
Install-Module -Name Posh-SSH -Force -Scope CurrentUser -AllowClobber
结果:Posh-SSH 3.2.7 安装成功。

阶段2:连接目标主机并查看当前配置

连通性测试:

Test-NetConnection -ComputerName 192.168.1.41 -Port 22
→ TcpTestSucceeded : True
建立SSH连接(Posh-SSH方式):

$password = ConvertTo-SecureString "root@1234" -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential("root", $password)
$session = New-SSHSession -ComputerName 192.168.1.41 -Credential $cred -AcceptKey
查看系统版本:

cat /etc/os-release
→ NAME="Rocky Linux"
→ VERSION="8.6 (Green Obsidian)"
→ VERSION_ID="8.6"
查看内核版本:

uname -r
→ 4.18.0-372.9.1.el8.x86_64
查看当前IP地址:

ip addr show
→ 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP
→ link/ether 00:0c:29:35:4e:c2 brd ff:ff:ff:ff:ff:ff
→ inet 192.168.1.41/24 brd 192.168.1.255 scope global noprefixroute ens33
查看路由表:

ip route show
→ default via 192.168.1.1 dev ens33 proto static metric 100
→ 192.168.1.0/24 dev ens33 proto kernel scope link src 192.168.1.41 metric 100
查看网卡配置文件:

cat /etc/sysconfig/network-scripts/ifcfg-ens33
→ TYPE=Ethernet
→ PROXY_METHOD=none
→ BROWSER_ONLY=no
→ BOOTPROTO=none
→ DEFROUTE=yes
→ IPV4_FAILURE_FATAL=yes
→ IPV6INIT=yes
→ IPV6_AUTOCONF=yes
→ IPV6_DEFROUTE=yes
→ IPV6_FAILURE_FATAL=no
→ NAME=ens33
→ UUID=8806b1bd-6076-4e7f-9f49-6c30131e039f
→ DEVICE=ens33
→ ONBOOT=yes
→ IPADDR=192.168.1.41
→ PREFIX=24
→ GATEWAY=192.168.1.1
→ DNS1=223.5.5.5
→ DNS2=114.114.114.114
NetworkManager状态:

nmcli connection show
→ NAME UUID TYPE DEVICE
→ ens33 8806b1bd-6076-4e7f-9f49-6c30131e039f ethernet ens33

nmcli device status
→ DEVICE TYPE STATE CONNECTION
→ ens33 ethernet 已连接 ens33
→ lo loopback 未托管 --
阶段3:修改IP配置

步骤1:备份配置文件

cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens33.bak_20260829
备份文件:ifcfg-ens33.bak_20260829(333字节)

步骤2:修改IP地址

sed -i 's/^IPADDR=192\.168\.1\.41$/IPADDR=192.168.1.228/' /etc/sysconfig/network-scripts/ifcfg-ens33
验证修改结果:

grep -E '^(IPADDR|PREFIX|GATEWAY|BOOTPROTO|ONBOOT)' /etc/sysconfig/network-scripts/ifcfg-ens33
→ BOOTPROTO=none
→ ONBOOT=yes
→ IPADDR=192.168.1.228
→ PREFIX=24
→ GATEWAY=192.168.1.1
步骤3:后台重启网络连接

由于修改IP后当前SSH连接会断开,采用nohup后台执行方式:

nohup bash -c 'sleep 2; nmcli connection down ens33; sleep 1; nmcli connection up ens33' > /tmp/network_restart.log 2>&1 &
注意:上述命令中PID输出显示为$!而非实际PID,是PowerShell转义问题,但命令本身已正确投递到远程执行。

阶段4:验证新IP

现象:网络重启后,新旧IP均无法连接(约1-2分钟)。

Test-NetConnection 192.168.1.41 -Port 22 → False
Test-NetConnection 192.168.1.228 -Port 22 → False
ping 192.168.1.228 → False
分析:NetworkManager重启连接过程中网络短暂中断,属于正常现象。用户在虚拟机控制台确认网络已恢复后,重新连接。

用新IP重新连接:

$session = New-SSHSession -ComputerName 192.168.1.228 -Credential $cred -AcceptKey -ConnectionTimeout 15
→ 连接成功!SessionId: 0
验证当前IP:

ip addr show ens33 | grep 'inet '
→ inet 192.168.1.228/24 brd 192.168.1.255 scope global noprefixroute ens33
验证配置文件:

grep -E '^(IPADDR|PREFIX|GATEWAY|BOOTPROTO|ONBOOT|DNS)' /etc/sysconfig/network-scripts/ifcfg-ens33
→ BOOTPROTO=none
→ ONBOOT=yes
→ IPADDR=192.168.1.228
→ PREFIX=24
→ GATEWAY=192.168.1.1
→ DNS1=223.5.5.5
→ DNS2=114.114.114.114
验证路由表:

ip route show
→ default via 192.168.1.1 dev ens33 proto static metric 100
→ 192.168.1.0/24 dev ens33 proto kernel scope link src 192.168.1.228 metric 100
验证网络连通性(ping网关):

ping -c 3 -W 2 192.168.1.1
→ 3 packets transmitted, 3 received, 0% packet loss, time 2004ms
→ rtt min/avg/max/mdev = 2.004/2.568/3.602/0.734 ms
结论:IP修改成功,网络正常,任务完成。

四、问题与解决方案汇总

编号 问题标题 报错关键词 根因 解决方案 关联日志
1 本地无SSH客户端 ssh : The term 'ssh' is not recognized Windows未安装OpenSSH客户端 安装Posh-SSH PowerShell模块 阶段1
2 pip安装paramiko失败 exit code -1,超时 网络环境限制(具体原因待查) 改用Posh-SSH模块 阶段1
3 Posh-SSH安装失败(首次) NonInteractive mode. Read and Prompt functionality is not available NuGet提供者安装需要交互确认 先Install-PackageProvider -Name NuGet -Force,再信任PSGallery,最后安装模块 阶段1
4 网络重启后短暂断连 新旧IP均无法连接 NetworkManager重启连接过程中网络中断 等待1-2分钟后自动恢复,或在虚拟机控制台确认 阶段4
五、常用命令速查

5.1 Posh-SSH(PowerShell SSH客户端)

# 建立凭证
$password = ConvertTo-SecureString "密码" -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential("用户名", $password)

# 建立SSH连接
$session = New-SSHSession -ComputerName IP -Credential $cred -AcceptKey

# 执行命令
Invoke-SSHCommand -SessionId $session.SessionId -Command "命令"

# 查看所有会话
Get-SSHSession

# 移除会话
Get-SSHSession | Remove-SSHSession
5.2 Linux网络配置(Rocky/RHEL/CentOS)

# 查看IP地址
ip addr show
ip addr show ens33

# 查看路由表
ip route show

# 查看网卡配置文件
cat /etc/sysconfig/network-scripts/ifcfg-ens33

# 查看NetworkManager连接
nmcli connection show
nmcli device status

# 修改配置文件中的IP
sed -i 's/^IPADDR=旧IP$/IPADDR=新IP/' /etc/sysconfig/network-scripts/ifcfg-ens33

# 重启网络连接
nmcli connection down ens33
nmcli connection up ens33

# 测试网络连通性
ping -c 3 -W 2 网关IP
5.3 后台执行网络重启(避免SSH断开中断)

nohup bash -c 'sleep 2; nmcli connection down ens33; sleep 1; nmcli connection up ens33' > /tmp/restart.log 2>&1 &
六、参考资料

序号 资料名称 链接/来源 备注
1 Posh-SSH模块 PowerShell Gallery 跨平台SSH PowerShell模块
2 Rocky Linux网络配置 Rocky Linux官方文档 NetworkManager与ifcfg文件
七、经验与教训

Windows环境SSH工具选型:当系统没有内置ssh客户端时,Posh-SSH是一个可靠的PowerShell原生方案,无需额外安装exe。安装时需先处理NuGet提供者的交互确认问题。

修改远程主机IP的注意事项:

修改IP后当前SSH连接必然断开,必须采用后台执行(nohup + &)方式重启网络,否则命令可能在连接断开时被中断。

网络重启后会有1-2分钟的断连窗口,属正常现象,不要急于判定失败。

建议在虚拟机控制台旁有人值守,或提前准备好控制台访问方式。

配置文件备份:修改任何系统配置文件前,必须先备份,命名包含日期,便于回滚。本次备份文件:ifcfg-ens33.bak_20260829。

sed修改配置的正则写法:使用^IPADDR=旧IP$精确匹配整行,避免误改其他包含该字符串的行。IP中的点号需要转义为\.。

验证要全面:IP修改后不能只看ip addr,还需验证配置文件持久化、路由表、网关连通性,确保重启后配置依然有效。

附录A:IP 修改自动化脚本

脚本文件:change_ip.sh
功能:自动化修改 RHEL/CentOS/Rocky 系列 Linux 的静态 IP 地址,包含参数校验、配置备份、修改、重启、回滚提示。
使用方法

chmod +x change_ip.sh
./change_ip.sh <网卡名> <新IP> <子网前缀> <网关>

# 示例
./change_ip.sh ens33 192.168.1.228 24 192.168.1.1
脚本特性

参数数量与格式校验(IP、网关正则匹配)

root 权限检查

网卡存在性检查

配置文件自动备份(含时间戳)

自动补全缺失的配置项(IPADDR/PREFIX/GATEWAY/BOOTPROTO/ONBOOT)

后台重启网络(避免 SSH 断开中断命令)

完整日志记录

回滚命令提示

完整脚本内容

#!/bin/bash
#============================================================
# 脚本名称:change_ip.sh
# 功能描述:自动化修改 Linux(RHEL/CentOS/Rocky 系列)静态 IP 地址
# 适用系统:Rocky Linux 8.x / CentOS 7/8 / RHEL 7/8
# 网络管理:NetworkManager(nmcli)+ ifcfg 配置文件
# 创建日期:2026-08-29
# 使用方式:
# chmod +x change_ip.sh
# ./change_ip.sh <网卡名> <新IP> <子网前缀> <网关>
# 示例:
# ./change_ip.sh ens33 192.168.1.228 24 192.168.1.1
#============================================================

set -euo pipefail

# ---------- 参数检查 ----------
if [ $# -ne 4 ]; then
echo "========================================"
echo " 用法: $0 <网卡名> <新IP> <子网前缀> <网关>"
echo " 示例: $0 ens33 192.168.1.228 24 192.168.1.1"
echo "========================================"
exit 1
fi

# ---------- 变量定义 ----------
IFACE="$1"
NEW_IP="$2"
PREFIX="$3"
GATEWAY="$4"
CONFIG_FILE="/etc/sysconfig/network-scripts/ifcfg-${IFACE}"
BACKUP_FILE="${CONFIG_FILE}.bak_$(date +%Y%m%d_%H%M%S)"
LOG_FILE="/tmp/change_ip_$(date +%Y%m%d_%H%M%S).log"

# ---------- 颜色输出 ----------
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

info() { echo -e "${GREEN}[INFO]${NC} $*"; }
warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
error() { echo -e "${RED}[ERROR]${NC} $*"; }

# ---------- 权限检查 ----------
if [ "$(id -u)" -ne 0 ]; then
error "此脚本必须以 root 身份运行"
exit 1
fi

# ---------- 网卡存在性检查 ----------
if ! ip link show "$IFACE" &>/dev/null; then
error "网卡 $IFACE 不存在"
echo "可用网卡列表:"
ip -o link show | awk -F': ' '{print $2}'
exit 1
fi

# ---------- 配置文件存在性检查 ----------
if [ ! -f "$CONFIG_FILE" ]; then
error "配置文件 $CONFIG_FILE 不存在"
exit 1
fi

# ---------- IP 格式校验 ----------
if ! echo "$NEW_IP" | grep -qE '^([0-9]{1,3}\.){3}[0-9]{1,3}$'; then
error "IP 地址格式不正确: $NEW_IP"
exit 1
fi

if ! echo "$GATEWAY" | grep -qE '^([0-9]{1,3}\.){3}[0-9]{1,3}$'; then
error "网关地址格式不正确: $GATEWAY"
exit 1
fi

# ---------- 获取当前IP ----------
CURRENT_IP=$(ip -4 addr show "$IFACE" | grep -oP '(?<=inet\s)\d+(\.\d+){3}' || echo "未知")

info "========================================"
info " 网卡: $IFACE"
info " 当前IP: $CURRENT_IP"
info " 新IP: $NEW_IP/$PREFIX"
info " 网关: $GATEWAY"
info " 配置文件: $CONFIG_FILE"
info " 备份文件: $BACKUP_FILE"
info " 日志文件: $LOG_FILE"
info "========================================"

# ---------- 步骤1:备份配置文件 ----------
info "[1/5] 备份配置文件..."
cp "$CONFIG_FILE" "$BACKUP_FILE"
info "备份完成: $BACKUP_FILE"

# ---------- 步骤2:修改配置文件 ----------
info "[2/5] 修改配置文件中的 IP 地址..."

if grep -q '^IPADDR=' "$CONFIG_FILE"; then
sed -i "s/^IPADDR=.*$/IPADDR=${NEW_IP}/" "$CONFIG_FILE"
else
echo "IPADDR=${NEW_IP}" >> "$CONFIG_FILE"
warn "配置文件中未找到 IPADDR,已追加"
fi

if grep -q '^PREFIX=' "$CONFIG_FILE"; then
sed -i "s/^PREFIX=.*$/PREFIX=${PREFIX}/" "$CONFIG_FILE"
else
echo "PREFIX=${PREFIX}" >> "$CONFIG_FILE"
warn "配置文件中未找到 PREFIX,已追加"
fi

if grep -q '^GATEWAY=' "$CONFIG_FILE"; then
sed -i "s/^GATEWAY=.*$/GATEWAY=${GATEWAY}/" "$CONFIG_FILE"
else
echo "GATEWAY=${GATEWAY}" >> "$CONFIG_FILE"
warn "配置文件中未找到 GATEWAY,已追加"
fi

if grep -q '^BOOTPROTO=' "$CONFIG_FILE"; then
sed -i 's/^BOOTPROTO=.*$/BOOTPROTO=none/' "$CONFIG_FILE"
else
echo "BOOTPROTO=none" >> "$CONFIG_FILE"
fi

if grep -q '^ONBOOT=' "$CONFIG_FILE"; then
sed -i 's/^ONBOOT=.*$/ONBOOT=yes/' "$CONFIG_FILE"
else
echo "ONBOOT=yes" >> "$CONFIG_FILE"
fi

info "配置文件修改完成"
info "修改后关键配置:"
grep -E '^(IPADDR|PREFIX|GATEWAY|BOOTPROTO|ONBOOT|DNS)' "$CONFIG_FILE" | sed 's/^/ /'

# ---------- 步骤3:验证配置文件语法 ----------
info "[3/5] 验证配置文件..."
if grep -q "IPADDR=${NEW_IP}" "$CONFIG_FILE"; then
info "配置文件中 IPADDR 验证通过"
else
error "配置文件中 IPADDR 验证失败,请检查"
exit 1
fi

# ---------- 步骤4:重启网络连接 ----------
info "[4/5] 重启网络连接..."
warn "注意:网络重启后当前 SSH 连接可能会断开"
warn "将采用后台方式执行,日志写入: $LOG_FILE"

nohup bash -c "
echo '=== 网络重启开始: \$(date) ===' > '$LOG_FILE'
sleep 2
echo '--- 执行 nmcli connection down $IFACE ---' >> '$LOG_FILE'
nmcli connection down '$IFACE' >> '$LOG_FILE' 2>&1
sleep 1
echo '--- 执行 nmcli connection up $IFACE ---' >> '$LOG_FILE'
nmcli connection up '$IFACE' >> '$LOG_FILE' 2>&1
echo '=== 网络重启结束: \$(date) ===' >> '$LOG_FILE'
" >/dev/null 2>&1 &

RESTART_PID=$!
info "网络重启命令已后台执行,PID: $RESTART_PID"
info "请等待 10-30 秒后使用新 IP $NEW_IP 重新连接"

# ---------- 步骤5:输出后续操作提示 ----------
info "[5/5] 操作完成!"
info "========================================"
info " 后续验证命令(用新IP连接后执行):"
info " ip addr show $IFACE"
info " ip route show"
info " ping -c 3 $GATEWAY"
info " cat $LOG_FILE"
info "========================================"
info "如需回滚,执行:"
info " cp $BACKUP_FILE $CONFIG_FILE"
info " nmcli connection down $IFACE && nmcli connection up $IFACE"
info "========================================"

exit 0
附录B:记录规范

命令原文留存:所有执行的关键命令完整复制,不省略参数。

报错原文留存:报错信息不 paraphrase,保留原始输出。

时间戳精确到分钟:便于回溯。

根因与方案分开写:先写分析过程,再写最终方案。

验证结果必记:解决方案是否生效,用什么方式验证的。

未解决的问题明确标注:不隐瞒,标注「待跟进」。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询