nmcli 命令赋予你直接在 Linux 命令行操作 NetworkManager 工具的能力。
nmcli发布于 2010 年,用以替代其他配置网络接口和连接的方法,例如 ifconfig。因为它是一个 命令行界面(CLI)工具,被设计用在终端窗口和脚本中,所以对于那些工作在没有 图形用户界面(GUI)的系统的管理员来说,它是一个非常理想的工具。ncmli 的语法
nmcli命令可以使用选项来更改它的行为,使用子命令来告诉nmcli想使用它的那部分功能,使用操作来告诉nmcli你想执行什么操作。$ nmcli <选项> <子命令> <操作>
nmcli一共有 8 个子命令,每个子命令有一些相关的网络操作:
help提供有关nmcli命令和使用方法的帮助信息general返回 NetworkManager 的状态和总体配置信息networking提供命令来查询某个网络连接的状态和启动、禁用连接的功能radio提供命令来查询某个 WiFi 网络连接的状态和启动、禁用连接的功能monitor提供命令来监控 NetworkManager 的活动并观察网络连接的状态改变connection提供命令来启用或禁用网络接口、添加新的连接、删除已有连接等功能device主要被用于更改与某个设备(例如接口名称)相关联的连接参数或者使用一个已有的连接来连接设备secret注册nmcli来作为一个 NetworkManager 的秘密代理,用以监听秘密信息。这个子命令很少会被用到,因为当连接到网络时,nmcli会自动做这些事简单的示例
首先,我们验证一下 NetworkManager 正在运行并且
nmcli可以与之通信:$ nmcli general STATE CONNECTIVITY WIFI-HW WIFI WWAN-HW WWAN connected full enabled enabled enabled enabled探测总是管理一个系统的首要部分。为了列出内存或磁盘上的网络连接配置,可以使用下面的命令:
$ nmcli connection show NAME UUID TYPE DEVICE Wired connection 1 ac3241e4-b424-35d6-aaa7-07498561688d ethernet enp0s3 Wired connection 2 2279d917-fa02-390c-8603-3083ec5a1d3e ethernet enp0s8 Wired connection 3 52d89737-de92-35ec-b082-8cf2e5ac36e6 ethernet enp0s9上面的命令使用了
connection子命令中的show操作。用来运行上面这个例子的测试机器上运行着 Ubuntu 20.04,它安装了 3 个网络适配器:
enp0s3、enp0s8和enp0s9。连接管理
理解
nmcli的术语是非常重要的。一个网络 连接 connection 包含了一个连接的所有信息。你可以将它看作一个网络 配置 configuration 。“连接”包含了与其相关的所有信息,包括 数据链路层 和 IP 地址信息 。它们是 OSI 网络模型 中的第 2 和第 3 层。当你在 Linux 上配置网络时,通常来说你是在为某个网络设备(它们是安装在一个电脑中的网络接口)配置连接。当一个连接被某个设备所使用,那么就可以说这个连接被 激活 active 或者 上线 up 了,反之是 停用 inactive 或 下线 down 。
添加网络连接
nmcli允许你快速地创建网络连接并同时为该连接指定参数。为了通过使用“有线连接 2”enp0s8来创建一个新的连接,你可以利用sudo来运行下面的命令:$ sudo nmcli connection add type ethernet ifname enp0s8 Connection 'ethernet-enp0s8' (09d26960-25a0-440f-8b20-c684d7adc2f5) successfully added.其中
type选项指定需要一个 Ethernet 类型的连接,而ifname(接口名)选项指定你想要为这个连接使用的网络接口设备。让我们看看发生了什么变化:
$ nmcli connection show NAME UUID TYPE DEVICE Wired connection 1 ac3241e4-b424-35d6-aaa7-07498561688d ethernet enp0s3 Wired connection 2 2279d917-fa02-390c-8603-3083ec5a1d3e ethernet enp0s8 Wired connection 3 52d89737-de92-35ec-b082-8cf2e5ac36e6 ethernet enp0s9 ethernet-enp0s8 09d26960-25a0-440f-8b20-c684d7adc2f5 ethernet --通过上图可以看到新的连接
ethernet-enp0s8已经创建好了。它的 通用唯一标识符 Universally Unique IDentifier (UUID)也一同被赋予,并且其连接类型为 “Ethernet”。我们可以使用up子命令再加上连接名称(或 UUID)来使得这个连接被激活:$ nmcli connection up ethernet-enp0s8 Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4)再次查看激活的连接:
$ nmcli connection show --active NAME UUID TYPE DEVICE Wired connection 1 ac3241e4-b424-35d6-aaa7-07498561688d ethernet enp0s3 ethernet-enp0s8 09d26960-25a0-440f-8b20-c684d7adc2f5 ethernet enp0s8 Wired connection 3 52d89737-de92-35ec-b082-8cf2e5ac36e6 ethernet enp0s9可以看到新的连接
ethernet-enp0s8现在已经被激活了,并且与enp0s8网络接口设备绑定。调整连接
nmcli命令使得调整现有连接的参数变得更加容易。也许你想将某个网络接口从 动态主机配置协议 Dynamic Host Configuration Protocol (DHCP)改为静态 IP 地址。假设你需要为你的新连接分配一个固定的 IP 地址
192.168.4.26,那么你需要使用两个命令,一个用于设定 IP 地址,另一个用来将获取 IP 地址的方法改为manual(手动):$ nmcli connection modify ethernet-enp0s8 ipv4.address 192.168.4.26/24 $ nmcli connection modify ethernet-enp0s8 ipv4.method manual记得指定 子网掩码,在我们这个测试的连接中,它是 无类域间路由 Classless Inter-Domain Routing (CIDR)中的
255.255.255.0或/24为了使得你的更改生效,你需要通过停止再重新启用该连接。下面的第一个命令是停用该连接,第二个命令则是启用它:
$ nmcli connection down ethernet-enp0s8 Connection 'ethernet-enp0s8' successfully deactivated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4) $ nmcli connection up ethernet-enp0s8 Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/6)假如你想将连接设置为使用 DHCP,则需要将上面的
manual改为auto(自动):$ nmcli connection modify ethernet-enp0s8 ipv4.method auto设备管理
nmcli命令中的device子命令允许你管理安装在你电脑中的网络接口。检查设备状态
可以使用下面的命令来快速检查所有网络接口的状态:
$ nmcli device status DEVICE TYPE STATE CONNECTION enp0s3 ethernet connected Wired connection 1 enp0s8 ethernet connected ethernet-enp0s8 enp0s9 ethernet connected Wired connection 3 lo loopback unmanaged --显示设备详情
为了检查某个网络接口的详情,可以使用
device子命令中的show操作。假如你不提供某个设备的名称,那么会获取并展示所有设备的详情。你可以上下翻动来查看这些信息。要查看你最近添加的连接所对应的设备
enp0s8,你可以使用下面的命令,请注意验证它使用的 IP 地址是否为先前你要求设置的那个:$ nmcli device show enp0s8 GENERAL.DEVICE: enp0s8 GENERAL.TYPE: ethernet GENERAL.HWADDR: 08:00:27:81:16:20 GENERAL.MTU: 1500 GENERAL.STATE: 100 (connected) GENERAL.CONNECTION: ethernet-enp0s8 GENERAL.CON-PATH: /org/freedesktop/NetworkManager/ActiveConnection/6 WIRED-PROPERTIES.CARRIER: on IP4.ADDRESS[1]: 192.168.4.26/24 IP4.GATEWAY: -- IP4.ROUTE[1]: dst = 192.168.4.0/24, nh = 0.0.0.0, mt = 103 IP6.ADDRESS[1]: fe80::6d70:90de:cb83:4491/64 IP6.GATEWAY: -- IP6.ROUTE[1]: dst = fe80::/64, nh = ::, mt = 103 IP6.ROUTE[2]: dst = ff00::/8, nh = ::, mt = 256, table=255上面的输出非常细致,它主要显示了下面这些内容:
- 网络接口名称,在这个示例中是
enp0s8,它是 udev 分配的- 网络连接类型,在这个示例中是物理的 Ethernet 连接
- 设备的 媒介访问控制 media access control (MAC)地址,它被用来在网络中识别该设备
- 最大传输单元,在单个传输中最大协议数据单位的大小,任何大于这个大小的数据将被分为多个包来进行传输
- 该设备当前已经处于连接状态
- 这个设备使用的连接名称是
ethernet-enp0s8- 这个设备使用的 IP 地址如上面所要求的那样,被设置为
192.168.4.26/24其他的信息则是与这个设备连接的网络相关的默认路由和网关设置信息。
nmcli 的交互式编辑器
尽管
nmcli是一个命令行工具,但它还包含一个基本的交互式编辑器,edit子命令将为你指定的连接打开一个交互式编辑器,例如:$ nmcli connection edit ethernet-enp0s8它将显示少量的帮助文字,接着是
nmcli的命令提示符:===| nmcli interactive connection editor |=== Editing existing '802-3-ethernet' connection: 'ethernet-enp0s8' Type 'help' or '?' for available commands. Type 'print' to show all the connection properties. Type 'describe [.]' for detailed property description. You may edit the following settings: connection, 802-3-ethernet (ethernet), 802-1x, dcb, sriov, ethtool, match, ipv4, ipv6, tc, proxy nmcli>假如你输入
Enter键,nmcli将列举出与这个接口相关的所有属性。这些属性有很多,你可以上下翻动来查看这个列表:=============================================================================== Connection profile details (ethernet-enp0s8) =============================================================================== connection.id: ethernet-enp0s8 connection.uuid: 09d26960-25a0-440f-8b20-c684d7adc2f5 connection.stable-id: -- connection.type: 802-3-ethernet connection.interface-name: enp0s8 connection.autoconnect: yes connection.autoconnect-priority: 0 connection.autoconnect-retries: -1 (default) connection.multi-connect: 0 (default) connection.auth-retries: -1 connection.timestamp: 1593967212 connection.read-only: no connection.permissions: -- connection.zone: -- connection.master: -- connection.slave-type: -- connection.autoconnect-slaves: -1 (default) connection.secondaries: --如果你想将你的连接改为 DHCP,则请输入
goto ipv4然后敲Enter键:nmcli> goto ipv4 You may edit the following properties: method, dns, dns-search, dns-options, dns-priority, addresses, gateway, routes, route-metric, route-table, routing-rules, ignore-auto-routes, ignore-auto-dns, dhcp-client-id, dhcp-iaid, dhcp-timeout, dhcp-send-hostname, dhcp-hostname, dhcp-fqdn, dhcp-hostname-flags, never-default, may-fail, dad-timeout nmcli ipv4>你想改变的属性是
method,再继续敲set method auto然后敲Enter键:nmcli ipv4> set method auto Do you also want to clear 'ipv4.addresses'? [yes]:假如你想让这个连接清除掉这个静态 IP 地址,则请敲
Enter键,如果要保留,则输入no然后敲Enter键。假如你想在将来再次使用它,你可以保留这个 IP 地址。即便存储了一个静态的 IP 地址,如果method被设置为auto,它仍然会使用 DHCP。最后输入
save来保存你的更改:nmcli ipv4> save Connection 'ethernet-enp0s8' (09d26960-25a0-440f-8b20-c684d7adc2f5) successfully updated. nmcli ipv4>输入
quit来离开nmcli的交互式编辑器窗口。假如你不想离开,可以输入back来回到最开始的命令行提示符界面,然后继续使用这个编辑器。nmcli 的更多内容
浏览交互式编辑器,你就可以看到
nmcli有多少设定和每个设定有多少属性。交互式编辑器是一个简洁的工具,但如果需要在命令行或者在脚本中使用nmcli,你还是需要使用常规的命令行版本。现在你有了这些基础知识,你还可以查看
nmcli的 man 页面 来查看它还可以提供什么更多功能。

在命令行中使用 nmcli 来管理网络连接
分享