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 | 显示版本信息 |
# 查看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 --
# 创建静态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"
# 扫描可用的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 ▂▄__ --
# 启用/禁用所有网络
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 # 等价命令
# 配置静态路由
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地址 |
#!/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"
#!/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"
#!/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
# 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
# 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
A: 主要区别:
| 特性 | nmcli (NetworkManager) | 传统工具 (ifconfig, route) |
|---|---|---|
| 配置持久性 | 配置自动保存,重启后有效 | 需要手动保存到配置文件 |
| 功能范围 | 支持现代网络技术 | 基本网络功能 |
| Wi-Fi支持 | 完整Wi-Fi管理功能 | 需要额外工具 |
| 桌面集成 | 与桌面环境紧密集成 | 无桌面集成 |
| 推荐场景 | 桌面和现代服务器 | 传统服务器和嵌入式系统 |
# 备份所有连接配置
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
# 创建离线连接配置
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的工具 | 轻量级网络管理 |