📌 前言
在 VMware、VirtualBox 或 PVE 中安装 Linux 虚拟机时,我们最常遇到的烦恼之一就是 IP 地址变动。
默认情况下,Ubuntu 使用 DHCP 自动获取 IP。这意味着每次重启或挂起恢复后,IP 地址可能会变成一个新的。这会导致:
- SSH 连接工具(如 Xshell、Putty)必须重新修改主机地址。
- 配置好的 Docker 容器端口映射失效。
- 集群节点之间通信断开。
虽然我们可以手动编辑配置文件来固定 IP,但从 Ubuntu 18.04 开始,网络管理工具变成了 Netplan。Netplan 的配置文件是 YAML 格式,对缩进极其敏感(多一个空格、少一个空格都会报错),手动修改非常容易翻车导致断网。
今天分享一个自动化 Shell 脚本,它能读取你当前临时的 IP 地址,自动生成标准的 Netplan 静态 IP 配置文件,一键搞定,永不换号!
🛠️ 脚本适用环境
- 操作系统:Ubuntu 18.04 / 20.04 / 22.04 / 24.04 (推荐 Server 版)
- 网卡名称:
ens33(VMware 默认常见名称,其他名称可微调脚本) - 用户权限:需要
root或sudo权限
💻 核心脚本代码
你可以直接在服务器上创建一个名为 fix_ip_ubuntu.sh 的文件,将以下内容复制进去。
#!/bin/bash
# ==========================================
# 脚本名称:fix_ip_ubuntu.sh
# 脚本功能:自动读取当前动态 IP 并转换为 Netplan 静态 IP 配置
# 作者:[你的名字]
# ==========================================
INTERFACE="ens33"
NETPLAN_DIR="/etc/netplan"
# 备份目录,防止改挂了回不去
BACKUP_DIR="${NETPLAN_DIR}/backup_$(date +%Y%m%d_%H%M%S)"
# 1. 安全检查:必须是 Root
if [ "$(id -u)" != "0" ]; then
echo "❌ 错误: 请使用 sudo 或 root 权限运行此脚本。"
exit 1
fi
# 2. 环境检查:网卡是否存在
if ! ip link show "$INTERFACE" > /dev/null 2>&1; then
echo "❌ 错误: 找不到网卡 $INTERFACE"
echo "提示: 请使用 'ip a' 查看你的实际网卡名称,并在脚本中修改 INTERFACE 变量。"
exit 1
fi
echo "🔍 正在读取当前网络信息..."
# 3. 自动抓取当前 IP 和网关信息
# 抓取 IP CIDR (例如 192.168.1.100/24)
CURRENT_IP_CIDR=$(ip -4 addr show $INTERFACE | grep -oP '(?<=inet\s)\d+(\.\d+){3}/\d+')
# 抓取网关 IP
GATEWAY=$(ip route | grep default | grep $INTERFACE | awk '{print $3}')
# 定义常用 DNS
DNS1="114.114.114.114"
DNS2="8.8.8.8"
if [ -z "$CURRENT_IP_CIDR" ] || [ -z "$GATEWAY" ]; then
echo "❌ 无法自动获取 IP 或网关,请确保当前网络已连接且有动态 IP。"
exit 1
fi
echo "--------------------------------"
echo "即将设置静态 IP 信息:"
echo "网卡设备: $INTERFACE"
echo "固定 IP : $CURRENT_IP_CIDR"
echo "默认网关: $GATEWAY"
echo "DNS 服务: $DNS1, $DNS2"
echo "--------------------------------"
read -p "确认修改吗?(y/n): " CONFIRM
if [ "$CONFIRM" != "y" ]; then
echo "已取消操作。"
exit 0
fi
# 4. 备份旧配置 (关键步骤)
# Netplan 会加载目录下所有 yaml,必须把旧的移走,否则会冲突
echo "📦 正在备份旧配置到 $BACKUP_DIR ..."
mkdir -p "$BACKUP_DIR"
# 如果目录下有 yaml 文件则移动
mv ${NETPLAN_DIR}/*.yaml "$BACKUP_DIR/" 2>/dev/null
# 5. 生成新的 Netplan 配置文件
NEW_CONFIG_FILE="${NETPLAN_DIR}/01-static-ens33.yaml"
# 使用 cat 生成 YAML 文件,确保缩进严谨
cat > "$NEW_CONFIG_FILE" <<EOF
network:
version: 2
renderer: networkd
ethernets:
$INTERFACE:
dhcp4: no
addresses:
- $CURRENT_IP_CIDR
routes:
- to: default
via: $GATEWAY
nameservers:
addresses: [$DNS1, $DNS2]
EOF
echo "✅ 新配置文件已生成: $NEW_CONFIG_FILE"
# 6. 应用配置
echo "🚀 正在应用 Netplan 配置..."
netplan apply
if [ $? -eq 0 ]; then
echo "🎉 成功!IP 地址已固定。"
echo "即使重启系统,IP 也不会再变了。"
else
echo "❌ 配置应用失败!正在自动回滚..."
# 恢复备份
rm "$NEW_CONFIG_FILE"
mv "$BACKUP_DIR"/*.yaml "$NETPLAN_DIR/"
netplan apply
echo "已恢复到修改前的状态。"
fi
🚀 使用教程
第一步:创建脚本
在终端中输入:
nano fix_ip_ubuntu.sh
将上面的代码粘贴进去,按 Ctrl+O 保存,按 Ctrl+X 退出。
第二步:赋予执行权限
脚本需要可执行权限才能运行:
chmod +x fix_ip_ubuntu.sh
第三步:执行脚本
因为涉及网络修改,必须加 sudo:
sudo ./fix_ip_ubuntu.sh
第四步:根据提示操作
脚本会显示当前抓取到的 IP 信息,输入 y 并回车即可。脚本会自动备份旧配置、写入新配置并刷新网络。
💡 脚本原理解析 (为什么比手写好?)
- 自动备份机制:
Netplan 的机制是读取/etc/netplan/下所有的.yaml文件并按字母顺序合并。如果你只新建文件而不删除旧文件(通常叫00-installer-config.yaml),很容易造成配置冲突(比如旧文件开 DHCP,新文件关 DHCP)。
本脚本会自动将旧文件移动到备份文件夹,确保配置环境纯净。
- 严谨的 YAML 格式:
YAML 语法禁止使用 Tab 键缩进,且层级必须对齐。脚本通过cat <<EOF的方式直接写入标准格式,杜绝了手写时的格式错误。 - 兼容性写法 (Routes vs Gateway4):
在新版 Netplan 中,直接写gateway4已经被标记为 deprecated(过时)。本脚本使用了官方推荐的 standardroutes写法:
routes:
- to: default
via: 192.168.x.1
这保证了脚本在 Ubuntu 20.04 到 24.04 上都能完美运行且没有警告。
⚠️ 注意事项
- 网卡名称:如果你的网卡不叫
ens33(比如叫eth0或enp3s0),请修改脚本第 9 行的INTERFACE="ens33"。 - 桌面版用户:如果你使用的是 Ubuntu Desktop(带图形界面),网络由 NetworkManager 接管。如果运行脚本后右上角网络图标消失,请编辑生成的 YAML 文件,将
renderer: networkd改为renderer: NetworkManager,然后再次sudo netplan apply即可。
总结:
别再每次重启都去查 IP 了!花 1 分钟运行这个脚本,把精力留给更重要的开发工作吧。
版权属于:soarli
本文链接:https://blog.soarli.top/archives/798.html
转载时须注明出处及本声明。