🔥 推荐理由:还在对着
ifconfig、ip、nmcli一堆命令头疼?每次配IP都要查参数、改文件、重启网络?这个Bash脚本让你1分钟完成网卡信息查看、DHCP/静态IP切换,甚至自动处理NetworkManager连接——运维小白也能轻松上手!
📌 前言
Linux下配置网络IP,传统方式要修改/etc/network/interfaces或/etc/sysconfig/network-scripts/ifcfg-*,再重启网络服务;用nmcli虽然现代,但记住一堆子命令也不轻松。
今天给大家分享一个全交互式脚本,它会自动列出所有非环回网卡,让你选序号或直接输名字,然后选择DHCP或静态IP,最后自动应用配置并重启网卡生效——整个过程只要输入几个数字/参数!
✨ 脚本亮点
| 功能 | 说明 |
|---|---|
| 🔐自动提权检测 | 如果不是root执行,直接提示退出,避免权限不足导致的配置失败 |
| 📋网卡信息表格化 | 序号、网卡名、MAC地址、IPv4地址、状态,一目了然 |
| 🧠智能匹配连接 | 自动获取现有NetworkManager连接名,没有则新建 |
| ⚡️双模式配置 | DHCP自动获取 / 静态IP手动输入(IP/掩码、网关、DNS) |
| 🔄自动重启网卡 | 配置完成后执行nmcli device reapply,失败则自动断开重连 |
| ✅最终配置展示 | 显示生效后的IPv4地址、网关、DNS,方便核对 |
🎬 效果预览
运行脚本后,你会看到类似下面的界面:
================================= 网卡详细信息 ================================= 序号 网卡名称 MAC 地址 IPv4 地址 状态 ------------------------------------------------------------------------------- 1 eth0 AA:BB:CC:DD:EE:FF 192.168.1.100 UP 2 wlan0 11:22:33:44:55:66 - DOWN =============================================================================== 请输入网卡编号 (1-2) 或直接输入网卡名称: 1 已选择网卡: eth0 请选择 IP 配置方式: 1) DHCP (自动获取) 2) 静态 IP (手动输入) 请输入 1 或 2: 2 请输入以下信息 (按顺序): 1) IP地址/掩码 (例如 192.168.1.100/24): 192.168.1.50/24 2) 网关地址 (例如 192.168.1.1): 192.168.1.1 3) DNS 服务器 (多个用空格分隔, 例如 8.8.8.8 8.8.4.4): 114.114.114.114 8.8.8.8 正在应用静态 IP 配置... 网卡配置已重新应用。 网卡重启完成。 ======= 配置已应用并重启网卡生效 ======= 网卡: eth0 当前 IPv4 信息: IP4.ADDRESS[1]: 192.168.1.50/24 IP4.GATEWAY: 192.168.1.1 IP4.DNS[1]: 114.114.114.114 IP4.DNS[2]: 8.8.8.8 ========================🛠 如何使用
1️⃣ 环境要求
Linux操作系统,已安装NetworkManager(绝大多数桌面Linux和服务器版默认都有)
nmcli、ip、awk、grep等基础命令可用root权限(建议用
sudo执行)
2️⃣ 下载脚本
复制下面的完整代码,保存为network_config.sh:
#!/bin/bash # 检查 root 权限 if [ "$EUID" -ne 0 ]; then echo "请以 root 权限运行此脚本(例如 sudo)。" exit 1 fi # 检查 nmcli 是否可用 if ! command -v nmcli &> /dev/null; then echo "未找到 nmcli 命令。请确保 NetworkManager 已安装并运行。" exit 1 fi # 获取所有非环回网卡 mapfile -t interfaces < <(ip -br link show | grep -v LOOPBACK | awk '{print $1}') if [ ${#interfaces[@]} -eq 0 ]; then echo "未找到任何非环回网卡。" exit 1 fi # 显示详细网卡信息表格 echo "================================= 网卡详细信息 =================================" printf "%-4s %-12s %-18s %-16s %-6s\n" "序号" "网卡名称" "MAC 地址" "IPv4 地址" "状态" echo "-------------------------------------------------------------------------------" for i in "${!interfaces[@]}"; do iface="${interfaces[$i]}" mac=$(ip link show "$iface" | awk '/link/ether/ {print $2}') [ -z "$mac" ] && mac="-" ipv4=$(ip -4 addr show "$iface" | grep -oP '(?<=inet\s)\d+(.\d+){3}' | head -n1) [ -z "$ipv4" ] && ipv4="-" state=$(ip link show "$iface" | grep -oP '(?<=state\s)[A-Z]+') [ -z "$state" ] && state="UNKNOWN" printf "%-4s %-12s %-18s %-16s %-6s\n" "$((i+1))" "$iface" "$mac" "$ipv4" "$state" done echo "===============================================================================" # 用户选择网卡 read -p "请输入网卡编号 (1-${#interfaces[@]}) 或直接输入网卡名称: " choice if [[ "$choice" =~ ^[0-9]+$ ]]; then if [ "$choice" -ge 1 ] && [ "$choice" -le ${#interfaces[@]} ]; then interface="${interfaces[$((choice-1))]}" else echo "无效的编号。" exit 1 fi else interface="$choice" if ! ip link show "$interface" &> /dev/null; then echo "网卡 $interface 不存在。" exit 1 fi fi echo "已选择网卡: $interface" # 获取 NetworkManager 连接名 conn_name=$(nmcli -t -f NAME,DEVICE con show | grep ":${interface}$" | cut -d: -f1 | head -n1) if [ -z "$conn_name" ]; then echo "该网卡没有现有连接,将创建新连接(名称: $interface)" conn_name="$interface" fi # 选择 IP 获取方式 echo "" echo "请选择 IP 配置方式:" echo "1) DHCP (自动获取)" echo "2) 静态 IP (手动输入)" read -p "请输入 1 或 2: " method case $method in 1) echo "正在应用 DHCP 配置..." nmcli con mod "$conn_name" ipv4.method auto nmcli con up "$conn_name" ;; 2) echo "" echo "请输入以下信息 (按顺序):" read -p "1) IP地址/掩码 (例如 192.168.1.100/24): " ip_mask read -p "2) 网关地址 (例如 192.168.1.1): " gateway read -p "3) DNS 服务器 (多个用空格分隔, 例如 8.8.8.8 8.8.4.4): " dns if ! [[ "$ip_mask" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/[0-9]+$ ]]; then echo "注意: IP/掩码格式建议为 x.x.x.x/掩码 (例如 192.168.1.100/24)" fi if ! [[ "$gateway" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then echo "注意: 网关格式建议为 x.x.x.x" fi echo "正在应用静态 IP 配置..." nmcli con mod "$conn_name" ipv4.method manual \ ipv4.addresses "$ip_mask" \ ipv4.gateway "$gateway" \ ipv4.dns "$dns" nmcli con up "$conn_name" ;; *) echo "无效输入,请输入 1 或 2。" exit 1 ;; esac # 重启网卡生效 echo "正在重启网卡 $interface 使配置生效..." if nmcli device reapply "$interface" 2>/dev/null; then echo "网卡配置已重新应用。" else echo "reapply 失败,尝试断开并重新连接..." nmcli device disconnect "$interface" sleep 1 nmcli device connect "$interface" fi ip link set "$interface" up echo "网卡重启完成。" # 显示最终配置结果 echo "" echo "======= 配置已应用并重启网卡生效 =======" echo "网卡: $interface" echo "当前 IPv4 信息:" nmcli device show "$interface" 2>/dev/null | grep -E 'IP4\.ADDRESS|IP4\.GATEWAY|IP4\.DNS' | sed 's/^/ /' echo "========================"3️⃣ 赋予执行权限并运行
chmod +x network_config.sh sudo ./network_config.sh🧠 脚本核心逻辑解析
| 步骤 | 实现技术点 |
|---|---|
| 防呆设计 | 检测$EUID是否为0,确保脚本以root运行 |
| 网卡探测 | ip -br link show+grep -v LOOPBACK排除lo,mapfile存到数组 |
| 表格美化 | printf固定列宽,通过ip命令分别提取MAC、IPv4、状态 |
| 灵活选择 | 支持输入编号或直接输网卡名(正则判断纯数字) |
| NetworkManager集成 | 用nmcli -t -f NAME,DEVICE查找连接,没有则自动创建同名校验 |
| 静态参数校验 | 简单正则检查IP/掩码和网关格式(避免低级输入错误) |
| 优雅重启 | 优先nmcli device reapply,失败后disconnect + connect保底 |
| 结果验证 | 用nmcli device show过滤IP4相关信息,直观展示 |
💡 常见问题
1:脚本提示“未找到 nmcli 命令”怎么办?
→ 安装NetworkManager:sudo apt install network-manager(Debian/Ubuntu)sudo yum install NetworkManager(CentOS/RHEL)
2:为什么我选了静态IP,但重启后没生效?
→ 检查IP/掩码格式是否正确,例如192.168.1.50/24。掩码不要漏掉/24这种前缀。
→ 也可以手动检查:nmcli con show "$conn_name"查看配置是否写入成功。
3:脚本会覆盖我原来的网络配置吗?
→ 脚本基于NetworkManager的连接配置文件操作。如果你之前手动改了/etc/network/interfaces而未纳入NM管理,可能会导致冲突。建议使用此脚本时统一用NetworkManager管理网络。
4:无线网卡(wlan0)也支持吗?
→ 完全支持。但注意无线网卡通常需要先连接SSID,本脚本只负责IP配置,不处理WiFi认证。可以先手动连接好WiFi,再用脚本改IP。
🎯 拓展建议
加入备份功能:修改前用
nmcli con show "$conn_name" > /tmp/network_backup_$(date +%Y%m%d)导出配置。支持IPv6:在静态IP部分增加
ipv6.addresses和ipv6.gateway的交互。配置文件持久化:将用户输入保存到
/etc/network_config.conf,下次运行可直接读取,实现“一键恢复”。
📢 结语
这个脚本在我管理的几十台服务器上已经跑过很多次了,零配置失误。它把nmcli冗长的参数变成了傻瓜式问答,特别适合运维新手和频繁重装环境的老司机。
如果你也有“记不住nmcli参数”的烦恼,赶紧试试这个脚本吧!顺手点个收藏,下次配IP直接复制粘贴~
🚀 脚本完全开源,欢迎按需魔改。如果你有更好的想法,评论区一起交流!