首页/新闻资讯/正文详情

nmcli命令实战:Linux网卡静态IP、多网卡与自动化配置

发布时间:2026/11/3 12:21:40 来源:云帆数科 栏目:资讯中心
nmcli命令实战:Linux网卡静态IP、多网卡与自动化配置
远程登录一台机器改完网卡 IP 敲回车的那一刻SSH 卡住了——这个画面做运维的大多都经历过。早些年改网卡得上手写/etc/sysconfig/network-scripts/ifcfg-eth0字段拼错了没人告诉你写完还得重启整个网络服务运气差一点所有网卡一起闪断。后来我把手里所有发行版的网卡配置都切到了nmcli这条命令上情况才彻底改观它把网卡配置变成了一条条可校验、可回滚、可写进脚本的命令。这篇就围绕nmcli 命令本身把语法骨架、静态地址落地、多网卡组合、常见踩坑和脚本化用法一次讲透。适合刚接手 Linux 服务器、被 ifcfg 文件折磨过的朋友也适合想把网卡配置纳入自动化流程的老手——哪怕你只会ip a看地址跟着走一遍也能上手。1. 从 ifcfg 文件到 nmcli换掉手写配置的真实理由1.1 手写网卡文件的三笔隐性成本先说清楚为什么要换。老的 ifcfg 格式本质是一堆键值对文本它最大的问题不是难写而是写完没有任何反馈。你把BOOTPROTOnone手滑写成BOOTPROTOnon或者把PREFIX24写成PRIFIX24保存退出时编辑器一声不吭重启网络服务时也不一定报错最后表现是地址没配上你得从头一行行比对。这笔时间成本在多台机器上批量做的时候会被放大得很难受。第二笔成本是生效范围。传统的重启网络服务方式作用于系统里所有网卡连接你只想改 eth1结果 eth0 也跟着闪断。而 nmcli 的最小生效单位是一条连接nmcli connection up 某条连接只影响那一条其它连接纹丝不动。这个差别在只有一块网卡的笔记本上感受不到但在跑着好几条业务链路、挂着若干虚拟网卡的服务器上是能救命的设计。第三笔成本是格式漂移。不同发行版、不同大版本之间ifcfg 的字段名和取值习惯并不统一比如有的地方接受BOOTPROTOstatic有的只认none网关有的写在网卡文件里有的走全局文件。nmcli 把这层差异吃掉了你面对的是统一的ipv4.addresses、ipv4.gateway、ipv4.dns这套属性名底层落到什么格式的文件由它自己决定。这就是我下决心全面切换的核心原因——我只需要记住一套词汇剩下的交给工具。1.2 三段式语法对象、动作、属性nmcli 的命令结构非常规整几乎是照着动词 名词的思路设计的完整形态是nmcli [全局选项] 对象 动作 [属性 值]。对象是你要操作的东西常用的就那么几个general全局状态、networking网络总开关、radio无线开关、connection连接配置、device设备。动作是你要干什么show、add、modify、up、down、delete、clone、reload。属性则是具体到某个配置项像ipv4.method、ipv4.addresses。这种设计的直接好处是猜得出来。你没查过文档也能猜到nmcli connection delete 某连接是删配置、nmcli device disconnect eth0是断开设备。对比一下想给一条连接加个 DNS旧思路是打开文件、找到 DNS1 那行、改值、保存、重启服务新思路是nmcli connection modify 连接名 ipv4.dns 1.1.1.1一步到位。我习惯把它类比成数据库操作——connection是表属性是字段modify就是 UPDATE改完再up相当于提交事务。理解了这层映射后面几十个属性名就不需要死记了。另外要养成一个习惯任何命令不确定就加help。nmcli connection help、nmcli connection modify help、nmcli connection add type bond help三级帮助一层层往下钻比翻网页快得多而且跟你的实际版本严格对应。这一点特别重要因为网上的教程经常和你机器上的版本对不上。1.3 版本差异那些让你照着教程报错的点nmcli 从早期 0.9.x 一路走到现在的 1.4x命令行为有过几次明显变化照抄老教程很容易踩空。最典型的是子命令简写老版本写nmcli con list新版本更喜欢nmcli connection show虽然简写大多仍然兼容但输出格式和可选参数不一样了。另外老版本里up后面必须跟 UUID现在连接名、UUID、设备名都能接受。文件落盘格式的变化影响更大。较早的系统中NetworkManager 默认用ifcfg-rh插件配置还是存成/etc/sysconfig/network-scripts/ifcfg-*那一套较新的版本默认切到keyfile插件配置变成/etc/NetworkManager/system-connections/*.nmconnection内容是 INI 风格。这意味着你在老机器上nmcli con mod完去翻文件看到的还是 ifcfg 格式在新机器上翻看到的是另一套。判断方法很简单改完一条配置去这两个目录看哪个文件的修改时间变了就知道当前用的是哪个插件。还有一个特别实用的新特性nmcli --offline大约 1.20 之后提供。它允许你在不连接 NetworkManager 服务的情况下生成配置文件比如nmcli --offline connection add type ethernet con-name xxx ifname eth0 ipv4.method manual ipv4.addresses 10.0.0.5/24 eth0.nmconnection输出重定向到文件就是一份成品配置。我在做系统镜像预置、或者给一批还没装系统的机器准备模板时就靠它。2. 搞清楚 device 和 connection 不是一回事2.1 一个设备可以挂多条连接但同一时刻只有一条激活这是新手最容易绕晕的地方也是后面所有坑的源头。device 是硬件或虚拟网卡的实体比如eth0、ens192、bond0connection 是一份配置方案有自己的名字con-name里面写着用静态还是 DHCP、IP 是多少、DNS 填什么。两者是多对一的关系一块网卡可以存在多份配置方案比如一份办公网静态、一份机房 DHCP但同一时刻只能有一条处于激活active状态。打个比方device 是岗位connection 是候选人简历。一个岗位可以收到多份简历但最终只能录用一个人上岗。你在nmcli connection modify里改的是简历内容nmcli connection up才是让这个人上岗。很多人改完配置发现没生效本质上就是改了简历但没换人上岗。这个模型还有个推论经常被忽略connection 的名字con-name和设备名ifname可以完全不同而且实际部署中往往真的不同。你可以建一条叫office-static的连接绑在ens192上。这时候nmcli connection up office-static是对的nmcli connection up ens192大概率报找不到连接。同理nmcli device disconnect ens192用的是设备名。搞混这两个名字是排查时最常见的浪费时间的点。2.2 四条查看命令及其输出怎么读排查任何网络问题我都会按固定顺序敲这四条基本两分钟内能定位到问题在哪一层。第一条nmcli general status。它给的是全局视角NetworkManager 服务在不在跑、整体连通性判断full / limited / none、当前主机名、有没有开无线。看到State: disconnected就说明服务活着但一条连接都没激活问题在连接层而不是驱动层。第二条nmcli device status。这张表是最有用的四列DEVICE、TYPE、STATE、CONNECTION。STATE 是connected表示设备被某条连接占用且正常工作disconnected表示设备在但没配置unmanaged表示这块设备压根不归 NetworkManager 管这时候你 nmcli 怎么改都不会生效得去查NetworkManager.conf里的 unmanaged 配置或者设备是否被别的服务接管了。第三条nmcli connection show。列出所有连接及其 NAME、UUID、TYPE、DEVICE 四列。DEVICE 那一列如果为空说明这条连接当前没激活如果有值说明正绑在那块设备上跑。第四条nmcli connection show 连接名。把某条连接的全部属性铺开输出非常长一般配合过滤用nmcli connection show 连接名 | grep ipv4。我还会加上--show-secrets来看无线密码之类的敏感字段默认会打星号。2.3 关键状态字段速查看到的字样含义通常要做什么connected设备已被某连接激活一般不用动继续查 IP 层disconnected设备在但没激活任何连接nmcli connection up 连接名unmanaged该设备不归 NetworkManager 管查 NetworkManager.conf 的 unmanaged 段unavailable设备存在但当前不可用查驱动、链路、下层依赖设备连接的 DEVICE 列为空该连接未激活激活它或检查 autoconnectipv4.method: auto走 DHCP 拿地址要固定地址就改 manualipv4.method: disabled明确禁用 IPv4从设备如 bond slave上常见顺便说个提效技巧nmcli默认会给部分输出加颜色、加表头做人工看挺好的但眼睛累。加上全局选项-ppretty可以让输出更整齐加-c no关掉颜色。这两个选项在把输出贴给别人看的时候很有用。3. 静态地址、网关、DNS 从配置到验证的全流程3.1 先决定新建还是修改别急着敲命令动手前先想清楚一件事你是要改造现有连接还是新建一条。判断依据是nmcli connection show里那条连接的属性和你的目标差多远。如果只是把 DHCP 改静态、或者换个 IP直接modify现有连接最省事设备名不用动激活顺序也不变。如果现有连接已经被其它业务依赖、你只是想临时加一套地址做测试新建一条更合适用完delete掉不污染原配置。还有一个中间选择nmcli connection clone。把现有连接复制一份改名再在新连接上改参数好处是原配置一丝不动随时切回去。我在给生产机做网络调整时偏好这个做法——出问题只要把原连接up回来就行回滚路径是现成的。需要提醒的是如果这台机器上一条连接都没有比如刚装完系统、网卡从没配过那你只能新建。新建时type选ethernetcon-name自己起个有意义的名字ifname必须和真实的设备名一致。设备名用nmcli device status查别凭记忆写eth0——现在不少系统用的是ens192、enp3s0这种可预测命名写错了连接建出来但绑不上任何设备。3.2 一条 add 命令讲清楚每个参数的意图新建一条静态地址连接我常用的完整命令是这样nmcli connection add \ type ethernet \ con-name office-static \ ifname ens192 \ ipv4.method manual \ ipv4.addresses 192.168.10.20/24 \ ipv4.gateway 192.168.10.1 \ ipv4.dns 192.168.10.2 192.168.10.3 \ connection.autoconnect yes逐段解释。type ethernet决定了这条连接支持哪些属性选错类型后面很多参数会报不支持的属性。con-name和ifname前面说过一个是配置名一个是设备名。ipv4.method manual是必须显式写的因为默认值是auto走 DHCP你不写它就会一边配着静态地址一边还去找 DHCP 服务器行为很别扭。ipv4.addresses后面的/24是前缀长度不是子网掩码。这一点跟ip addr add的习惯一致但跟老 ifcfg 的NETMASK255.255.255.0不一样转过来的时候别写错。地址里如果带多个用空格分隔并整体加引号。ipv4.gateway只能写一个多网关的需求得靠策略路由解决后面第 4 章会讲。ipv4.dns支持多个用空格分隔整体加引号写多个的意义是第一个查询超时会自动轮询下一个。connection.autoconnect yes虽然默认就是 yes我仍然习惯显式写上——脚本里显式声明比依赖默认值可靠将来默认值变了也不会翻车。新建完还没激活要敲一条nmcli connection up office-static。想改现有连接把add换成modify即可后面的属性写法完全一样nmcli connection modify office-static \ ipv4.addresses 192.168.10.21/24 \ ipv4.gateway 192.168.10.13.3 加减号追加属性多地址和多 DNS 的正确写法modify有个很贴心但很多人不知道的语法属性名前面加表示追加加-表示移除不加则是整体覆盖。这个区别在处理多地址时至关重要。# 追加第二个地址原地址保留 nmcli connection modify office-static ipv4.addresses 192.168.10.22/24 # 删掉其中一个地址 nmcli connection modify office-static -ipv4.addresses 192.168.10.22/24 # 整体覆盖成只剩一个地址 nmcli connection modify office-static ipv4.addresses 192.168.10.30/24我见过有人想加第二个 IP直接写ipv4.addresses 新地址结果原地址被顶掉业务断了还以为命令没生效。记住这个规律单个值语义的属性网关、metric直接用列表语义的属性addresses、dns、routing-rules想保留旧值就必须带。DNS 同理ipv4.dns 1.1.1.1是追加直接写是替换。3.4 三个把 DNS 和路由搞乱的默认行为配置写对了验证时却发现 DNS 不是自己填的那个或者默认路由跑到了不该走的网卡上八成是撞上了这三个默认行为。第一个DHCP 下发的 DNS 会覆盖你手填的。如果ipv4.method还是auto你modify ipv4.dns是能写进去的但每次重新激活DHCP 服务器给的 DNS 会追加进来顺序还可能在你手填的前面。解决办法是显式关掉nmcli connection modify 连接名 ipv4.ignore-auto-dns yes。这个开关我做 DHCP 保留地址的机器时必加。第二个多网卡抢默认路由。两块网卡都配了网关系统会按 route-metric路由度量值从小到大选默认路由值越小优先级越高。默认值往往由连接激活顺序或设备类型决定容易出现重启后默认路由换了一块网卡的诡异现象。想固定住就手动设nmcli connection modify 连接名 ipv4.route-metric 100另一块设 200。或者干脆让某块网卡不产生默认路由nmcli connection modify 连接名 ipv4.never-default yes。第三个DNS 优先级由连接顺序决定/etc/resolv.conf里的 nameserver 顺序会随连接激活顺序变化。如果某台机器对解析顺序敏感建议不要依赖自动生成的 resolv.conf而是把关键 DNS 固定下来同时明确各连接的 route-metric 顺序。这三条我都是吃过亏才记住的写在配置模板里当成固定项。3.5 验证要分三层别只看地址配上了ip addr show能看到地址不代表网络通了。我的验证顺序固定是三层。第一层本地配置层。ip addr show ens192看地址和掩码对不对ip route show看默认路由指向哪个网关、走的哪块网卡。这里最容易发现的是地址有了但没路由说明网关没配上或者never-default被误开。第二层链路与邻居层。ping 网关地址能通说明二层和三层到网关这一跳没问题不通就先查网线、交换机端口、VLAN 划分这时候改配置文件是没用的。第三层名称解析层。cat /etc/resolv.conf看 nameserver 是不是预期的然后getent hosts 某个域名测试解析。用getent而不是ping 域名是因为getent走的是系统解析器能真实反映应用会拿到什么结果而ping在某些环境下会走别的路径。三层都过了我才会去nmcli connection show 连接名把关键属性再对一遍确认落盘的内容和预期一致。这个先验证再确认的顺序比一上来就翻配置文件要快。4. 多地址、多网卡与虚拟设备的组合打法4.1 一块网卡挂多个 IP 的两种写法一卡多 IP 有两种做法各有适用场景。第一种是同一条连接里放多个地址用ipv4.addresses追加所有地址共享同一个网关和 DNS。这种写法简单激活/停用是一体的适合主地址 几个别名地址的常规场景比如一台机器同时提供多个站点服务。第二种是建多条连接绑同一块设备每条连接配一个地址。听起来很奇怪但确实能用同一时刻只有一条连接激活所以实际上不会冲突它的价值在于多套配置快速切换。比如一条是生产地址、一条是测试地址nmcli connection up 生产连接/up 测试连接一键切换比每次改地址安全得多。需要留意的是多地址场景下ipv4.gateway只有一个多出来的地址不会有独立网关如果需要按源地址分流到不同出口那得进到策略路由的范畴用ipv4.routing-rules配合ipv4.route-table这门手艺比本文的主题深一层建议先把基础配稳再碰。4.2 双网卡同网段能不通就尽量不通有一种配置看起来合理、实际非常麻烦两块网卡配在同一网段比如ens192是 192.168.10.20/24ens193是 192.168.10.21/24网关都是 192.168.10.1。这时系统会有两条到 192.168.10.0/24 的路由回包走哪块网卡取决于内核的选择结果就是能 ping 通一会儿一会儿又断排查起来非常费劲。我的处理原则是同一网段只用一块网卡做三层通信第二块网卡如果是为了链路冗余就做成 bond如果是为了多路径就走策略路由明确指定源地址和出口。真要在 nmcli 层面缓解可以给两块网卡设不同的ipv4.route-metric让其中一块的路由优先级明显更高至少行为是确定的。4.3 bond、bridge、VLAN 的配置顺序不能乱虚拟网络设备的配置有个铁律先建下层再建上层最后给上层配地址。顺序反了会报找不到 master或者建出来绑不上。**bond链路聚合**的顺序是先建 bond 连接本身再建各个 slave 连接指向它。# 1. 建 bond 主连接 nmcli connection add type bond con-name bond0 ifname bond0 \ bond.options modeactive-backup,miimon100 \ ipv4.method manual ipv4.addresses 192.168.20.10/24 ipv4.gateway 192.168.20.1 # 2. 把两块物理网卡作为 slave 挂上去 nmcli connection add type bond-slave con-name bond0-slave1 ifname ens192 master bond0 nmcli connection add type bond-slave con-name bond0-slave2 ifname ens193 master bond0 # 3. 先启 slave再启主连接 nmcli connection up bond0-slave1 nmcli connection up bond0-slave2 nmcli connection up bond0这里有个关键点slave 连接不要配 IP它的ipv4.method应该是disabled。地址只配在 bond0 上。我见过把地址配在 slave 上的结果 bond 起来了但流量走不通。另外mode的选择要看对端交换机支持什么active-backup是主备不需要交换机做特殊配置802.3adLACP需要交换机端口侧也配好聚合组两边不一致会导致链路时通时断。**bridge网桥**的顺序同理先建桥再挂端口nmcli connection add type bridge con-name br0 ifname br0 \ ipv4.method manual ipv4.addresses 192.168.30.10/24 ipv4.gateway 192.168.30.1 nmcli connection add type bridge-slave con-name br0-port1 ifname ens192 master br0 nmcli connection up br0VLAN相对简单一条命令就能建但dev必须指向一个已经存在的父设备nmcli connection add type vlan con-name vlan100 ifname ens192.100 dev ens192 id 100 \ ipv4.method manual ipv4.addresses 192.168.100.10/24虚拟设备的共同坑是激活顺序。桥和 bond 的主连接如果先于 slave 激活经常会处于激活了但没有端口的状态看着 connected 实际不通。稳妥做法是 slave 全部 up 完再 up 主连接或者干脆依赖 autoconnect 的依赖关系让它自己排——但我不太信任自动排序手动敲三条命令也就几秒钟。5. 配置写进去了却不生效四类原因和排查路径5.1 第一类名字对不上症状是nmcli connection up报 Error: unknown connection或者命令成功但device status里的 CONNECTION 列还是空的。原因几乎都是 con-name 和 ifname 搞混。排查动作很机械先nmcli connection show拿到准确的连接名注意名字里的空格和大小写有空格必须整体加引号再nmcli device status拿到准确的设备名两个都列出来对照一遍。还有一种更隐蔽的情况连接名和设备名恰好一样你也敲对了但设备处于unmanaged。这时候命令不会报错只是什么都不会发生。nmcli device status第四列显示--而第二列显示unmanaged就是这个信号。根因通常是设备被写进了 NetworkManager 的忽略列表或者该设备的驱动模块不被支持。5.2 第二类autoconnect 和多连接的竞争症状是重启后网络正常但用的不是你期望的那条连接或者手动 up 了一条过一会儿又被另一条顶掉。这是 autoconnect 在起作用多条连接同时autoconnect yes且绑在同一设备上时NetworkManager 会挑一条激活选择的依据包括connection.autoconnect-priority数值越大越优先和连接的新旧程度。处理方式很直接。要么把不需要自动激活的连接关掉nmcli connection modify 某连接 connection.autoconnect no要么明确优先级nmcli connection modify 主连接 connection.autoconnect-priority 10备用的设 0 甚至负数。我倾向于两条都做——关掉不该自动起来的再给该起来的设优先级行为最确定。5.3 第三类reload、up、reapply 三个动作搞混了这三个动作的语义差别很大用错了就会出现命令成功了但没效果的错觉。动作作用对象干了什么什么时候用nmcli connection reload全部配置文件重新读取磁盘上的配置文件不改变运行时状态手工改过配置文件后让服务感知到改动nmcli connection up 连接名单条连接重新激活这条连接会短暂中断该连接的流量改了 IP、网关等需要重建的参数后nmcli device reapply 设备名单个设备把配置增量应用到已激活连接尽量不断流改 DNS、MTU、路由等可增量应用的参数最常见的误解是把reload当万能药。手工编辑了配置文件之后敲reload配置文件是被重新读取了但当前激活的连接仍然跑着旧参数网络行为不会变——还得up一次。反过来只up不reload你手改的文件内容根本进不了内存up出来的还是旧配置。手改文件的标准流程是reload→up。device reapply是较新版本才提供的大致 1.10 之后它的价值在于改 DNS 这类参数时可以不断开连接。我现在的习惯是能用reapply就用reapply实在不行才up。可以先试nmcli device reapply ens192如果提示不支持某些属性的变更再退回up。5.4 第四类文件和运行时状态打架排查要走完整的链路这是最难的一类因为症状飘忽有时看着配对了有时改了又回去了。完整的排查链路我一般是这么走的一步步缩小范围不跳步。第一步确认你改的是哪个文件。用nmcli connection show 连接名看输出里有没有filename这个属性它直接告诉你这条连接落在哪个文件、用哪个插件管的。看到.nmconnection说明是 keyfile 插件看到ifcfg-*说明是 ifcfg-rh。这一步决定你后面该去看哪个目录。第二步确认文件内容和你以为的一致。打开那个文件看实际写了什么。keyfile 格式是 INI 风格[ipv4]段下是address1192.168.10.20/24,192.168.10.1这种写法ifcfg 格式是IPADDR...、PREFIX...。如果发现文件里内容和nmcli connection show的输出不一致说明有人手改过文件但没reload运行时用的还是内存里的旧值。第三步确认服务状态有没有报错。NetworkManager 自己的日志会给很明确的线索用journalctl -u NetworkManager -n 100 --no-pager看最近一百行重点找error、failed、conflict这类关键词。设备起不来、地址冲突、插件加载失败日志里都写得很清楚比瞎猜快得多。第四步确认没有第二个管理者。早期系统里可能存在另一套网络管理脚本和服务如果它还在跑就会和 NetworkManager 抢同一块网卡。表现是 nmcli 配好之后过几分钟配置被改回去。检查方法是看有没有别的网络相关服务处于 active 状态以及设备是否显示unmanaged。第五步最后才是怀疑配置本身。走到这一步还没解决就把整条连接删了重建用一条最简的命令验证基础功能是否正常先只配地址不配网关通了再加网关再加 DNS一步步加。这种最小可用集逐步逼近的方式比对着几十行属性找错要快。6. 无线连接、脚本化解析与批量下发6.1 命令行配 WiFi 其实比图形界面快nmcli 管无线连接的能力经常被低估。常用的几条# 看无线开关状态必要时打开 nmcli radio wifi nmcli radio wifi on # 扫描周边网络扫描需要一点时间稍等再列 nmcli device wifi rescan nmcli device wifi list # 连接一个开放网络 nmcli device wifi connect 某无线名称 # 连接带密码的网络 nmcli device wifi connect 某无线名称 password 连接口令 # 连接隐藏网络 nmcli device wifi connect 某隐藏网络名 password 连接口令 hidden yesnmcli device wifi connect会自动创建一条 wifi 类型的连接并激活成功后nmcli connection show里就能看到。想以后自动连上把这条连接的connection.autoconnect确认为 yes 即可。需要给无线固定地址的场景先连一次生成连接再nmcli connection modify 连接名 ipv4.method manual ipv4.addresses ...补上静态参数。一个实测心得wifi list的输出里有个SIGNAL列是信号强度但刚rescan完立刻列出来的数据可能还是缓存。我的习惯是 rescan 之后等两三秒再 list或者连查两次取第二次的结果准确率高得多。6.2 用 -t、-f、-g 把输出变成脚本能吃的格式人看表格舒服脚本看表格难受。nmcli 提供了三个全局选项解决这个问题这是它比手写配置文件更适合自动化的关键所在。-tterse把输出改成精简模式列之间用冒号分隔、不打印表头。-ffields指定只要哪几列。-gget-values直接只输出值连字段名都不给。三个组合起来取单个属性一行命令搞定# 列出所有连接名和设备名冒号分隔 nmcli -t -f NAME,DEVICE connection show # 只取某个连接的当前 IP nmcli -g ipv4.addresses connection show office-static # 只取某个设备的连接状态 nmcli -t -f DEVICE,STATE device status # 判断某块网卡是否已连接用于脚本分支 nmcli -t -f STATE device show ens192需要注意一个小陷阱-t模式下如果某个值本身包含冒号比如某些 IPv6 地址解析会错位。稳妥做法是尽量避免解析带冒号的字段或者改用-g单值输出。我在写巡检脚本时踩过这个坑后来统一改成一个属性一次-g调用虽然多了几次进程启动但逻辑简单不出错。6.3 批量下发的幂等写法与远程操作自保把网卡配置推给一批机器最大的要求是幂等——同一套命令跑一遍和跑十遍结果一样不会因为连接已存在而报错中断。我的做法是先判断连接在不在在就 modify不在才 addCON_NAMEoffice-static IF_NAMEens192 if nmcli -t -f NAME connection show | grep -qx $CON_NAME; then nmcli connection modify $CON_NAME \ ipv4.method manual \ ipv4.addresses 192.168.10.20/24 \ ipv4.gateway 192.168.10.1 else nmcli connection add type ethernet con-name $CON_NAME ifname $IF_NAME \ ipv4.method manual \ ipv4.addresses 192.168.10.20/24 \ ipv4.gateway 192.168.10.1 fi nmcli connection up $CON_NAME这里grep -qx的-x是整行精确匹配避免连接名互为前缀时误判比如office和office-static。关于远程操作自保这是我最想强调的一条。通过 SSH 远程改 IP一旦nmcli connection up执行完新地址没通你的会话就断了再也连不回去。我现在的固定套路是加一个延迟回滚在改配置之前先把一条恢复原样的命令丢进定时任务给足自己操作窗口。# 5 分钟后自动执行回滚给自己留够验证时间 echo nmcli connection modify $CON_NAME ipv4.addresses 原地址/24 nmcli connection up $CON_NAME | at now 5 minutes验证新地址通了之后把这条定时任务删掉。at不可用的话退而求其次用nohup bash -c sleep 300 回滚命令 。这个习惯救过我很多次尤其是在跨机房、没有带外管理可用的环境里。另一个更温和的选择是先在本地用screen或tmux挂着会话操作断线后会话还在但前提是断的只是 SSH 而机器本身还在正常运行——如果新配置把机器网络彻底搞没了tmux也救不了还是得靠定时回滚。还有个小技巧值得记如果只是想验证一份配置能不能用又不确定会不会把网络搞挂可以先用nmcli --offline把配置生成为文件人眼过一遍内容确认无误再真正add上去。这一步能过滤掉绝大多数低级错误比如地址写成192.168.10.20少了前缀、网关写成本机地址、ipv4.method忘了写。最后分享一个我在实际使用中的体会nmcli 真正省事的地方不在于它比手写文件少敲几个字符而在于它把网卡配置变成了一段可以存进版本库、可以 code review、可以在别的机器上原样重放的命令。我现在每台新机器的网络配置都是十几条 nmcli 命令组成的脚本交付给谁都一样机器重装也只要跑一遍。这套习惯形成之后我再没打开过 ifcfg 文件——除了极少数需要看老机器历史配置的时候。

相关推荐

竞技比赛得分统计与最大化技术解析
竞技比赛得分统计与最大化技术解析

1. 比赛得分统计的核心挑战在各类竞技比赛中,如何准确统计并最大化选手得分一直是组织者和参赛者共同关注的焦点问题。2024年9月15日这个时间节点可能指向某个特定赛事或统计方法的更新,但无论具体场景如何,得分最大化问题都涉及以下几个关键… · 2026/11/3 12:21:40

移位与异或运算:计算机底层性能优化核心技术
移位与异或运算:计算机底层性能优化核心技术

1. 移位与异或运算的本质解析位运算作为计算机底层最基础的操作之一,其执行效率远超常规算术运算。在性能敏感场景(如哈希计算、数据加密、图形处理)中,合理运用位运算往往能带来数量级的性能提升。移位和异或作为位运算的核心操作… · 2026/11/3 12:21:40

树形动态规划:解决Rinne Loves Edges问题
树形动态规划:解决Rinne Loves Edges问题

1. 项目背景与问题定义 "牛客每日一题:Rinne Loves Edges"这个题目来自牛客网的算法题库,是一道典型的树形动态规划问题。这类题目在互联网公司的技术面试中经常出现,特别是涉及图论和树形结构处理的岗位。 题目描述通常是这样&am… · 2026/11/3 12:21:40

LinkedList知识
LinkedList知识

一、LinkedList 介绍LinkedList 是 List 接口的实现类,同时实现了Deque(双端队列)接口 ✅ List 共性:有序、可重复、带索引 底层:双向链表,每个 Node 节点:prev前驱指针 item数据 next后继指针… · 2026/11/3 19:25:22

英特尔量子生意
英特尔量子生意

英特尔在量子计算已经埋头干了十几年,从硅自旋量子比特芯片,到控制电子设备,再到软件,各个部件都碰过。如今英特尔又要收购Classiq公司,准备认认真真把这么多年的量子研究变成一门正经生意,哪怕短期内没有高… · 2026/11/3 19:25:22

ViiTor Memo:让每一次对话,都成为 AI 可以调用的记忆
ViiTor Memo:让每一次对话,都成为 AI 可以调用的记忆

我们做 ViiTor Memo,并不是因为市面上缺少一款“能录音、能转写、能总结”的产品。恰恰相反,这类产品已经很多了。真正让我们反复思考的是:为什么工具越来越多,我们仍然会忘记那些重要的对话?为什么开完会、聊完需求、… · 2026/11/3 19:25:22

LTE 站点电源告警排查实录:小区频闪退服问题定位
LTE 站点电源告警排查实录:小区频闪退服问题定位

摘要:本文记录一起 LTE 站点电源告警引发的排查过程。站点上报电源告警并伴随小区频闪退服,自 19 号起每日大致在 17~21 点时段反复出现,具有明显的时段规律性。结合 RRU-1 输入电源失败告警(约 10 秒即清除)、15 分钟粒度性能数据以及白天实时状态正常的现象,初步判断为… · 2026/11/3 19:25:22

HTML 零基础入门到企业实战全套教程【2.3 常用头部标签:meta、title、link、style 实战用法】
HTML 零基础入门到企业实战全套教程【2.3 常用头部标签:meta、title、link、style 实战用法】

系列专栏&#xff1a;HTML 零基础入门到企业实战全套教程【连载系列】 上一章&#xff1a;2.2 HTML 页面基础结构、标签规范 适合人群&#xff1a;零基础小白、转行前端、在校学生 学习目标&#xff1a;理解 <head> 标签内部作用&#xff0c;掌握 meta、title、link、sty… · 2026/11/3 19:25:22

前端小白也能掌握的Agent开发,升级你的产品体验与职业价值
前端小白也能掌握的Agent开发,升级你的产品体验与职业价值

本文深入浅出地介绍了Agent开发的核心概念与前端在其中的关键作用&#xff0c;指出Agent开发并非前端技能的边缘延伸&#xff0c;而是对其原有能力的升级与拓展。文章强调前端在理解用户意图、状态管理、交互设计及业务流程方面的优势&#xff0c;为前端转向Agent开发提供了清晰… · 2026/11/3 19:24:22

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46

STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码