linux nmcli命令

简介:nmcli是NetworkManager的命令行工具,用于配置和管理网络连接。它提供了完整的NetworkManager功能集,可以替代传统的网络配置工具如ifconfig、route等。
nmcli的主要功能
  • 网络连接管理:创建、修改、删除网络连接
  • 设备状态监控:查看网络设备状态和配置
  • 无线网络管理:扫描和连接Wi-Fi网络
  • 网络配置:IP地址、DNS、路由等配置
  • VPN管理:配置和管理VPN连接
  • 网络会话管理:管理不同的网络配置会话
  • 团队/绑定接口:配置网络绑定和团队接口
  • 网络桥接:配置网络桥接
  • 网络诊断:网络连接故障排查
  • 脚本自动化:支持脚本自动化配置

语法格式

nmcli [选项] 对象 {命令 | help}

说明:nmcli采用"对象-命令"的结构,首先指定要操作的对象(如device、connection),然后指定要执行的命令。

主要对象和命令

对象 说明 常用命令
general NetworkManager整体状态和权限 status, hostname, permissions
networking 整体网络控制 on, off, connectivity
radio 无线网络开关 all, wifi, wwan
connection 网络连接管理 show, up, down, add, modify, delete
device 网络设备管理 status, show, connect, disconnect
agent 密钥管理代理 secret, polkit, all
monitor 监控网络状态变化 持续监控

常用选项

选项 说明
-t, --terse 简洁输出模式,适合脚本处理
-p, --pretty 美观输出模式,易读性好
-m, --mode 指定输出模式 (tabular, multiline)
-f, --fields 指定输出字段
-e, --escape 在简洁模式下转义字符
-a, --ask 交互式询问缺失参数
-s, --show-secrets 显示密码等敏感信息
-h, --help 显示帮助信息
-v, --version 显示版本信息

使用示例

示例1:查看网络状态和设备信息
# 查看NetworkManager整体状态
nmcli general status

# 查看所有网络设备状态
nmcli device status

# 查看指定设备的详细信息
nmcli device show eth0

# 查看所有网络连接
nmcli connection show

# 查看活动连接
nmcli connection show --active
# nmcli device status 输出示例:
DEVICE  TYPE      STATE      CONNECTION
eth0    ethernet  connected  eth0-conn
wlan0   wifi      connected  Home-WiFi
lo      loopback  unmanaged  --
示例2:有线网络配置
# 创建静态IP有线连接
sudo nmcli connection add type ethernet con-name "office-net" ifname eth0 \
    ipv4.addresses 192.168.1.100/24 \
    ipv4.gateway 192.168.1.1 \
    ipv4.dns "8.8.8.8 8.8.4.4" \
    ipv4.method manual

# 创建DHCP有线连接
sudo nmcli connection add type ethernet con-name "home-dhcp" ifname eth0 \
    ipv4.method auto

# 修改现有连接
sudo nmcli connection modify "office-net" \
    ipv4.addresses "192.168.1.150/24" \
    ipv4.dns "1.1.1.1"

# 启用/禁用连接
sudo nmcli connection up "office-net"
sudo nmcli connection down "office-net"

# 删除连接
sudo nmcli connection delete "office-net"
示例3:无线网络管理
# 扫描可用的Wi-Fi网络
nmcli device wifi list

# 连接开放的Wi-Fi网络
sudo nmcli device wifi connect "Free-WiFi"

# 连接有密码保护的Wi-Fi网络
sudo nmcli device wifi connect "Home-WiFi" password "your-password"

# 创建Wi-Fi连接配置
sudo nmcli connection add type wifi con-name "Home-WiFi" ifname wlan0 \
    ssid "Home-WiFi" \
    wifi-sec.key-mgmt wpa-psk \
    wifi-sec.psk "your-password"

# 断开Wi-Fi连接
sudo nmcli device disconnect wlan0

# 查看Wi-Fi网络详细信息
nmcli -f ALL device wifi list
# nmcli device wifi list 输出示例:
IN-USE  SSID               MODE   CHAN  RATE        SIGNAL  BARS  SECURITY
*       Home-WiFi          Infra  6     130 Mbit/s  85      ▂▄▆█  WPA2
        Office-Net         Infra  1     195 Mbit/s  75      ▂▄▆_  WPA2
        Free-WiFi          Infra  11    65 Mbit/s   50      ▂▄__  --
示例4:网络控制和管理
# 启用/禁用所有网络
sudo nmcli networking on
sudo nmcli networking off

# 启用/禁用Wi-Fi
sudo nmcli radio wifi on
sudo nmcli radio wifi off

# 查看网络连接状态
nmcli networking connectivity check

# 重新加载NetworkManager配置
sudo nmcli connection reload

# 监控网络状态变化
nmcli monitor

# 设置主机名
sudo nmcli general hostname server1
hostnamectl set-hostname server1  # 等价命令
示例5:高级网络配置
# 配置静态路由
sudo nmcli connection modify "office-net" \
    +ipv4.routes "10.0.0.0/8 192.168.1.254" \
    +ipv4.routes "172.16.0.0/12 192.168.1.254"

# 配置多IP地址
sudo nmcli connection modify "office-net" \
    +ipv4.addresses "192.168.1.200/24"

# 配置IPv6
sudo nmcli connection modify "office-net" \
    ipv6.method auto \
    ipv6.addr-gen-mode eui64

# 配置网络桥接
sudo nmcli connection add type bridge con-name br0 ifname br0
sudo nmcli connection add type ethernet con-name br0-slave ifname eth0 master br0

# 配置绑定接口
sudo nmcli connection add type bond con-name bond0 ifname bond0 \
    bond.options "mode=active-backup,miimon=100" \
    ipv4.method manual \
    ipv4.addresses "192.168.1.100/24"
sudo nmcli connection add type ethernet con-name bond0-slave1 ifname eth1 master bond0
sudo nmcli connection add type ethernet con-name bond0-slave2 ifname eth2 master bond0

配置字段详解

常用配置字段
字段类别 字段名 说明
IPv4配置 ipv4.method IP获取方式:auto(DHCP), manual(静态), disabled(禁用)
ipv4.addresses IP地址和掩码,如"192.168.1.100/24"
ipv4.gateway 默认网关地址
ipv4.dns DNS服务器地址,多个用空格分隔
ipv4.routes 静态路由,如"10.0.0.0/8 192.168.1.254"
Wi-Fi配置 wifi.ssid Wi-Fi网络名称
wifi-sec.key-mgmt 安全模式:wpa-psk, wpa-eap, none
wifi-sec.psk Wi-Fi密码
wifi.mode Wi-Fi模式:infra(基础), ap(热点), adhoc
连接属性 connection.id 连接名称(显示名称)
connection.uuid 连接UUID(唯一标识符)
connection.autoconnect 是否自动连接:yes/no
设备属性 connection.interface-name 网络接口名称
802-3-ethernet.mac-address MAC地址

实战应用场景

场景1:服务器网络配置脚本
自动化服务器网络配置:
#!/bin/bash
# server_network_setup.sh

INTERFACE="eth0"
CONNECTION_NAME="server-static"
IP_ADDRESS="192.168.1.100/24"
GATEWAY="192.168.1.1"
DNS_SERVERS="8.8.8.8 8.8.4.4"
ADDITIONAL_IPS=("192.168.1.101/24" "192.168.1.102/24")

echo "开始配置服务器网络..."

# 删除现有连接(如果存在)
if nmcli connection show | grep -q "$CONNECTION_NAME"; then
    echo "删除现有连接: $CONNECTION_NAME"
    sudo nmcli connection delete "$CONNECTION_NAME"
fi

# 创建新的静态连接
echo "创建静态连接..."
sudo nmcli connection add type ethernet \
    con-name "$CONNECTION_NAME" \
    ifname "$INTERFACE" \
    ipv4.method manual \
    ipv4.addresses "$IP_ADDRESS" \
    ipv4.gateway "$GATEWAY" \
    ipv4.dns "$DNS_SERVERS" \
    ipv4.route-metric 100 \
    connection.autoconnect yes

# 添加额外的IP地址
for ip in "${ADDITIONAL_IPS[@]}"; do
    echo "添加额外IP: $ip"
    sudo nmcli connection modify "$CONNECTION_NAME" +ipv4.addresses "$ip"
done

# 添加静态路由
echo "添加静态路由..."
sudo nmcli connection modify "$CONNECTION_NAME" \
    +ipv4.routes "10.0.0.0/8 $GATEWAY" \
    +ipv4.routes "172.16.0.0/12 $GATEWAY"

# 激活连接
echo "激活连接..."
sudo nmcli connection up "$CONNECTION_NAME"

# 验证配置
echo ""
echo "=== 网络配置验证 ==="
echo "IP地址配置:"
ip addr show "$INTERFACE" | grep "inet "
echo ""
echo "路由表:"
ip route show
echo ""
echo "DNS配置:"
cat /etc/resolv.conf | grep "nameserver"
场景2:桌面环境Wi-Fi管理
自动连接最强信号的Wi-Fi网络:
#!/bin/bash
# wifi_auto_connect.sh

KNOWN_NETWORKS=("Home-WiFi" "Office-Net" "Guest-WiFi")
WIFI_INTERFACE="wlan0"

echo "开始Wi-Fi自动连接..."

# 确保Wi-Fi已启用
sudo nmcli radio wifi on

# 扫描网络
echo "扫描可用网络..."
nmcli device wifi rescan

# 获取信号最强的已知网络
BEST_NETWORK=""
BEST_SIGNAL=0

for network in "${KNOWN_NETWORKS[@]}"; do
    SIGNAL=$(nmcli -t -f SSID,SIGNAL device wifi list | \
             grep "^$network:" | \
             cut -d: -f2 | \
             sort -nr | \
             head -1)

    if [ -n "$SIGNAL" ] && [ "$SIGNAL" -gt "$BEST_SIGNAL" ]; then
        BEST_SIGNAL="$SIGNAL"
        BEST_NETWORK="$network"
    fi
done

if [ -n "$BEST_NETWORK" ] && [ "$BEST_SIGNAL" -gt 30 ]; then
    echo "连接到最佳网络: $BEST_NETWORK (信号强度: ${BEST_SIGNAL}%)"

    # 检查是否已连接
    CURRENT_CONNECTION=$(nmcli -t -f NAME,DEVICE connection show --active | \
                        grep ":$WIFI_INTERFACE$" | \
                        cut -d: -f1)

    if [ "$CURRENT_CONNECTION" != "$BEST_NETWORK" ]; then
        echo "断开当前连接: ${CURRENT_CONNECTION:-无}"
        sudo nmcli device disconnect "$WIFI_INTERFACE"

        echo "连接到: $BEST_NETWORK"
        sudo nmcli device wifi connect "$BEST_NETWORK"
    else
        echo "已连接到最佳网络,无需操作"
    fi
else
    echo "未找到合适的已知网络"
fi

# 显示当前连接状态
echo ""
echo "=== 当前Wi-Fi状态 ==="
nmcli device status | grep "$WIFI_INTERFACE"
nmcli connection show --active | grep "wifi"
场景3:网络故障排查和诊断
自动化网络故障排查脚本:
#!/bin/bash
# network_diagnosis.sh

echo "=== 网络故障诊断报告 $(date) ==="
echo ""

# 1. 检查NetworkManager服务状态
echo "1. NetworkManager服务状态:"
systemctl status NetworkManager --no-pager -l | grep -E "(Active:|Main PID:|Status:)"

# 2. 检查网络设备状态
echo ""
echo "2. 网络设备状态:"
nmcli device status

# 3. 检查活动连接
echo ""
echo "3. 活动连接:"
nmcli connection show --active

# 4. 检查网络连通性
echo ""
echo "4. 网络连通性检查:"
nmcli networking connectivity check

# 5. 检查DNS解析
echo ""
echo "5. DNS解析测试:"
for dns in "8.8.8.8" "1.1.1.1" "192.168.1.1"; do
    if ping -c 1 -W 1 "$dns" > /dev/null 2>&1; then
        echo "  ✓ DNS服务器 $dns 可达"
    else
        echo "  ✗ DNS服务器 $dns 不可达"
    fi
done

# 6. 检查网关连接
echo ""
echo "6. 网关连接检查:"
GATEWAY=$(ip route show default | awk '{print $3}')
if [ -n "$GATEWAY" ]; then
    echo "  默认网关: $GATEWAY"
    if ping -c 2 -W 1 "$GATEWAY" > /dev/null 2>&1; then
        echo "  ✓ 网关可达"
    else
        echo "  ✗ 网关不可达"
    fi
else
    echo "  未找到默认网关"
fi

# 7. 建议操作
echo ""
echo "7. 建议操作:"
if ! systemctl is-active --quiet NetworkManager; then
    echo "  - 启动NetworkManager服务: sudo systemctl start NetworkManager"
fi

if nmcli networking connectivity | grep -q "none"; then
    echo "  - 网络不可用,检查物理连接"
fi

if nmcli device status | grep -q "disconnected"; then
    echo "  - 有设备未连接,尝试: nmcli device connect [设备名]"
fi
nmcli的优势
  • 统一的网络管理接口
  • 支持所有现代网络技术
  • 配置持久化,重启后仍有效
  • 支持脚本自动化
  • 提供详细的网络状态信息
  • 支持Wi-Fi、以太网、VPN等多种连接
  • 与桌面环境集成良好
注意事项
  • 需要NetworkManager服务运行
  • 某些操作需要root权限
  • 与传统网络脚本可能冲突
  • 配置变更可能需要重启连接
  • 不同版本可能有差异
  • 复杂的配置可能需要多次尝试
  • 备份重要配置
常用故障排除命令
快速解决常见网络问题:
# 1. 网络连接不稳定
sudo nmcli connection reload
sudo systemctl restart NetworkManager

# 2. Wi-Fi无法连接
sudo nmcli radio wifi off
sudo nmcli radio wifi on
sudo nmcli device wifi rescan

# 3. 忘记Wi-Fi密码
sudo nmcli connection show "WiFi-Name" | grep psk
sudo nmcli -s connection show "WiFi-Name" | grep psk  # 显示密码

# 4. 修复DNS问题
sudo nmcli connection modify "connection-name" ipv4.dns "8.8.8.8 8.8.4.4"
sudo nmcli connection up "connection-name"
sudo systemctl restart systemd-resolved

# 5. 恢复默认网络配置
sudo rm /etc/NetworkManager/system-connections/*.nmconnection
sudo systemctl restart NetworkManager

# 6. 查看详细日志
sudo journalctl -u NetworkManager --no-pager -f
sudo nmcli general logging level DEBUG domains ALL
常见问题解答
Q: 如何安装NetworkManager和nmcli?
# Ubuntu/Debian
sudo apt update
sudo apt install network-manager

# RHEL/CentOS 8+
sudo dnf install NetworkManager

# RHEL/CentOS 7
sudo yum install NetworkManager

# Fedora
sudo dnf install NetworkManager

# 启用并启动服务
sudo systemctl enable NetworkManager
sudo systemctl start NetworkManager

# 检查安装版本
nmcli --version
Q: nmcli和传统网络配置工具有什么区别?

A: 主要区别:

特性 nmcli (NetworkManager) 传统工具 (ifconfig, route)
配置持久性 配置自动保存,重启后有效 需要手动保存到配置文件
功能范围 支持现代网络技术 基本网络功能
Wi-Fi支持 完整Wi-Fi管理功能 需要额外工具
桌面集成 与桌面环境紧密集成 无桌面集成
推荐场景 桌面和现代服务器 传统服务器和嵌入式系统
Q: 如何备份和恢复网络配置?
# 备份所有连接配置
sudo cp -r /etc/NetworkManager/system-connections/ ~/network-backup/

# 导出特定连接配置
nmcli connection show "connection-name" > ~/connection-backup.txt

# 恢复连接配置
sudo cp ~/network-backup/* /etc/NetworkManager/system-connections/
sudo chmod 600 /etc/NetworkManager/system-connections/*
sudo systemctl restart NetworkManager

# 重新导入连接
sudo nmcli connection load /etc/NetworkManager/system-connections/connection-name.nmconnection
Q: 如何在无网络环境下配置网络?
# 创建离线连接配置
sudo nmcli connection add type ethernet con-name "offline-config" ifname eth0 \
    ipv4.method manual \
    ipv4.addresses 192.168.1.100/24 \
    ipv4.gateway 192.168.1.1 \
    connection.autoconnect no

# 稍后启用连接
sudo nmcli connection up "offline-config"

# 修改现有连接的离线配置
sudo nmcli connection modify "existing-connection" \
    ipv4.addresses "192.168.1.200/24" \
    ipv4.gateway "192.168.1.1" \
    ipv4.dns "8.8.8.8"
sudo nmcli connection up "existing-connection"
与其他工具对比
工具 主要功能 适用场景
nmcli 完整的NetworkManager命令行接口 现代Linux桌面和服务器网络管理
nmtui NetworkManager文本用户界面 交互式网络配置,适合初学者
ifconfig 传统网络接口配置 基本网络接口管理,兼容性要求
ip 高级网络配置工具 底层网络配置,脚本自动化
netplan Ubuntu网络配置工具 Ubuntu服务器网络配置
wicd 替代NetworkManager的工具 轻量级网络管理