soarli

拒绝手动改配置!一键 Shell 脚本搞定 Ubuntu 固定 IP (Netplan版)
📌 前言在 VMware、VirtualBox 或 PVE 中安装 Linux 虚拟机时,我们最常遇到的烦恼之一就...
扫描右侧二维码阅读全文
05
2026/02

拒绝手动改配置!一键 Shell 脚本搞定 Ubuntu 固定 IP (Netplan版)

📌 前言

在 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 默认常见名称,其他名称可微调脚本)
  • 用户权限:需要 rootsudo 权限

💻 核心脚本代码

你可以直接在服务器上创建一个名为 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 并回车即可。脚本会自动备份旧配置、写入新配置并刷新网络。


💡 脚本原理解析 (为什么比手写好?)

  1. 自动备份机制
    Netplan 的机制是读取 /etc/netplan/ 下所有的 .yaml 文件并按字母顺序合并。如果你只新建文件而不删除旧文件(通常叫 00-installer-config.yaml),很容易造成配置冲突(比如旧文件开 DHCP,新文件关 DHCP)。

本脚本会自动将旧文件移动到备份文件夹,确保配置环境纯净。

  1. 严谨的 YAML 格式
    YAML 语法禁止使用 Tab 键缩进,且层级必须对齐。脚本通过 cat <<EOF 的方式直接写入标准格式,杜绝了手写时的格式错误。
  2. 兼容性写法 (Routes vs Gateway4)
    在新版 Netplan 中,直接写 gateway4 已经被标记为 deprecated(过时)。本脚本使用了官方推荐的 standard routes 写法:
  routes:
    - to: default
      via: 192.168.x.1

这保证了脚本在 Ubuntu 20.04 到 24.04 上都能完美运行且没有警告。


⚠️ 注意事项

  • 网卡名称:如果你的网卡不叫 ens33(比如叫 eth0enp3s0),请修改脚本第 9 行的 INTERFACE="ens33"
  • 桌面版用户:如果你使用的是 Ubuntu Desktop(带图形界面),网络由 NetworkManager 接管。如果运行脚本后右上角网络图标消失,请编辑生成的 YAML 文件,将 renderer: networkd 改为 renderer: NetworkManager,然后再次 sudo netplan apply 即可。

总结:

别再每次重启都去查 IP 了!花 1 分钟运行这个脚本,把精力留给更重要的开发工作吧。

最后修改:2026 年 02 月 05 日 01 : 52 AM

发表评论