Merge pull request #19543 from wxy/20200721-Manage-network-connections-from-the-Linux-command-line-with-nmcli

PRF&PUB:20200721 Manage network connections from the Linux command line with nmcli
This commit is contained in:
Xingyu.Wang 2020-09-10 10:20:29 +08:00 committed by GitHub
commit 3551ec4c67
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,8 +1,8 @@
[#]: collector: "lujun9972" [#]: collector: "lujun9972"
[#]: translator: "FSSlc" [#]: translator: "FSSlc"
[#]: reviewer: " " [#]: reviewer: "wxy"
[#]: publisher: " " [#]: publisher: "wxy"
[#]: url: " " [#]: url: "https://linux.cn/article-12599-1.html"
[#]: subject: "Manage network connections from the Linux command line with nmcli" [#]: subject: "Manage network connections from the Linux command line with nmcli"
[#]: via: "https://opensource.com/article/20/7/nmcli" [#]: via: "https://opensource.com/article/20/7/nmcli"
[#]: author: "Dave McKay https://opensource.com/users/davemckay" [#]: author: "Dave McKay https://opensource.com/users/davemckay"
@ -10,36 +10,36 @@
在命令行中使用 nmcli 来管理网络连接 在命令行中使用 nmcli 来管理网络连接
====== ======
nmcli 命令赋予你直接在 Linux 命令行操作 NetworkManager 工具的能力。 > nmcli 命令赋予你直接在 Linux 命令行操作 NetworkManager 工具的能力。
![坐在窗前笔记本电脑的一位商业女士][1] ![](https://img.linux.net.cn/data/attachment/album/202009/10/100302z2xq9cieqyekxbdc.jpg)
[nmcli][2] 命令赋予你直接在 Linux 命令行操作 NetworkManager 工具的能力。它是 NetworkManager 软件包集成的一部分,通过使用一些 [应用程序接口][3]API来获取 NetworkManager 的功能。 [nmcli][2] 命令赋予你直接在 Linux 命令行操作 NetworkManager 工具的能力。它是 NetworkManager 软件包集成的一部分,通过使用一些 [应用程序接口][3]API来获取 NetworkManager 的功能。
nmcli 于 2010 年发布,用以替代其他配置网络接口和连接的方法,例如 [ifconfig][4]。因为它是 [命令行界面][5]CLI工具 被设计用在终端窗口和脚本中,所以对于那些工作在没有 [图形界面][6]GUI的系统管理员来说是它是一个非常理想的工具。 `nmcli` 发布于 2010 年,用以替代其他配置网络接口和连接的方法,例如 [ifconfig][4]。因为它是一个 [命令行界面][5]CLI工具被设计用在终端窗口和脚本中所以对于那些工作在没有 [图形用户界面][6]GUI的系统的管理员来说它是一个非常理想的工具。
### ncmli 的语法 ### ncmli 的语法
nmcli 命令接受 __选项__ (options) 来更改 nmcli 的行为,接受 __子命令__ (section) 来告诉 nmcli 想使用它的那部分功能,使用 __操作__ (action) 来告诉 nmcli 你想执行什么操作。 `nmcli` 命令可以使用*选项*来更改它的行为,使用*子命令*来告诉 `nmcli` 想使用它的那部分功能,使用*操作*来告诉 `nmcli` 你想执行什么操作。
``` ```
$ nmcli <options> <section> <action> $ nmcli <选项> <子命令> <操作>
``` ```
nmcli 一共有 8 个子命令,每个子命令有一些相关的网络操作: `nmcli` 一共有 8 个子命令,每个子命令有一些相关的网络操作:
* **help** 提供有关 nmcli 命令和使用方法的帮助信息 * `help` 提供有关 `nmcli` 命令和使用方法的帮助信息
* **general** 返回 NetworkManager 的状态和总体配置信息 * `general` 返回 NetworkManager 的状态和总体配置信息
* **networking** 提供命令来查询某个网络连接的状态和启动、禁用连接的功能 * `networking` 提供命令来查询某个网络连接的状态和启动、禁用连接的功能
* **radio** 提供命令来查询某个 WiFi 网络连接的状态和启动、禁用连接的功能 * `radio` 提供命令来查询某个 WiFi 网络连接的状态和启动、禁用连接的功能
* **monitor** 提供命令来监控 NetworkManager 的活动并观察网络连接的状态改变 * `monitor` 提供命令来监控 NetworkManager 的活动并观察网络连接的状态改变
* **connection** 提供命令来启用或禁用网络接口、添加新的连接、删除已有连接等功能 * `connection` 提供命令来启用或禁用网络接口、添加新的连接、删除已有连接等功能
* **device** 主要被用于更改与某个设备(例如接口名称)相关联的连接参数或者使用一个已有的连接来连接设备 * `device` 主要被用于更改与某个设备(例如接口名称)相关联的连接参数或者使用一个已有的连接来连接设备
* **secret** 注册 nmcli 来作为一个 NetworkManager 的秘密代理,用以监听秘密信息。这个子命令很少会被用到,因为当连接到网络时, nmcli 会自动做这些事 * `secret` 注册 `nmcli` 来作为一个 NetworkManager 的秘密代理,用以监听秘密信息。这个子命令很少会被用到,因为当连接到网络时,`nmcli` 会自动做这些事
### 简单的示例 ### 简单的示例
首先,我们验证一下 NetworkManager 正在运行并且 nmcli 可以与之通信: 首先,我们验证一下 NetworkManager 正在运行并且 `nmcli` 可以与之通信:
``` ```
$ nmcli general $ nmcli general
@ -63,20 +63,20 @@ Wired connection 3  52d89737-de92-35ec-b082-8cf2e5ac36e6  ethernet  enp0s9
### 连接管理 ### 连接管理
理解 nmcli 的术语是非常重要的。一个网络 **连接** 包含了一个连接的所有信息。你可以将它看作一个网络**配置**。一个连接包含了与一个连接相关的所有信息,包括 [数据链路层][7] 和 [IP 地址信息][8] 。它们是 [OSI 网络模型][9] 中的第 2 和第 3 层。 理解 `nmcli` 的术语是非常重要的。一个网络<ruby>连接<rt>connection</rt></ruby>包含了一个连接的所有信息。你可以将它看作一个网络<ruby>配置<rt>configuration</rt></ruby>。“连接”包含了与其相关的所有信息,包括 [数据链路层][7] 和 [IP 地址信息][8] 。它们是 [OSI 网络模型][9] 中的第 2 和第 3 层。
当你在 LInux 上配置网络时,通常来说你在为某个网络设备(它们是安装在一个电脑中的网络接口)配置连接。当一个连接被某个设备所使用,那么就可以说这个连接被**激活**或者**启用**了,反之是**停用**或**下线** 当你在 Linux 上配置网络时,通常来说你是在为某个网络设备(它们是安装在一个电脑中的网络接口)配置连接。当一个连接被某个设备所使用,那么就可以说这个连接被<ruby>激活<rt>active</rt></ruby>或者<ruby>上线<rt>up</rt></ruby>了,反之是<ruby>停用<rt>inactive</rt></ruby><ruby>下线<rt>down</rt></ruby>
#### 添加网络连接 #### 添加网络连接
nmcli 允许你快速地创建网络连接并同时为该连接指定参数。为了通过使用 有线连接 2 `enp0s8`来创建一个新的连接,你可以利用`sudo` 来运行下面的命令: `nmcli` 允许你快速地创建网络连接并同时为该连接指定参数。为了通过使用“有线连接 2” `enp0s8` 来创建一个新的连接,你可以利用 `sudo` 来运行下面的命令:
``` ```
$ sudo nmcli connection add type ethernet ifname enp0s8 $ sudo nmcli connection add type ethernet ifname enp0s8
Connection 'ethernet-enp0s8' (09d26960-25a0-440f-8b20-c684d7adc2f5) successfully added. Connection 'ethernet-enp0s8' (09d26960-25a0-440f-8b20-c684d7adc2f5) successfully added.
``` ```
其中 `type` 选项指定需要一个 [Ethernet][10] 的连接,而 `ifname`(接口名)选项指定你想要为这个连接使用的网络接口设备。 其中 `type` 选项指定需要一个 [Ethernet][10] 类型的连接,而 `ifname`(接口名)选项指定你想要为这个连接使用的网络接口设备。
让我们看看发生了什么变化: 让我们看看发生了什么变化:
@ -89,7 +89,7 @@ Wired connection 3  52d89737-de92-35ec-b082-8cf2e5ac36e6  ethernet  enp0s9
ethernet-enp0s8     09d26960-25a0-440f-8b20-c684d7adc2f5  ethernet  --   ethernet-enp0s8     09d26960-25a0-440f-8b20-c684d7adc2f5  ethernet  --  
``` ```
通过上图可以看到新的连接 `ethernet-enp0s8` 已经创建好了。它的 [通用唯一标识符][11]UUID也一同被赋予并且其连接类型为 Ethernet。我们可以使用 `up` 子命令再加上连接名称(或 UUID来使得这个连接被激活 通过上图可以看到新的连接 `ethernet-enp0s8` 已经创建好了。它的 <ruby>[通用唯一标识符][11]<rt>Universally Unique IDentifier</rt></ruby>UUID也一同被赋予并且其连接类型为 Ethernet。我们可以使用 `up` 子命令再加上连接名称(或 UUID来使得这个连接被激活
``` ```
$ nmcli connection up ethernet-enp0s8 $ nmcli connection up ethernet-enp0s8
@ -110,16 +110,16 @@ Wired connection 3  52d89737-de92-35ec-b082-8cf2e5ac36e6  ethernet  enp0s9
#### 调整连接 #### 调整连接
nmcli 命令使得调整现有连接的参数变得更加容易。也许你想将某个网络接口从 [动态主机配置协议][12]DHCP改为静态 IP 地址。 `nmcli` 命令使得调整现有连接的参数变得更加容易。也许你想将某个网络接口从 <ruby>[动态主机配置协议][12]<rt>Dynamic Host Configuration Protocol</rt></ruby>DHCP改为静态 IP 地址。
假设你需要为你的新连接分配一个固定的 IP 地址 `192.168.4.26`,那么你需要使用两个命令,一个用于设定 IP 地址,另一个用来将获取 IP 地址的方法改为 `manual` 假设你需要为你的新连接分配一个固定的 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.address 192.168.4.26/24
$ nmcli connection modify ethernet-enp0s8 ipv4.method manual $ nmcli connection modify ethernet-enp0s8 ipv4.method manual
``` ```
记得特别指定 [子网掩码][13],在我们这个测试的连接中,它是 [无类域间路由][14]CIDR中的 `255.255.255.0``/24` 记得指定 [子网掩码][13],在我们这个测试的连接中,它是 <ruby>[无类域间路由][14]<rt> Classless Inter-Domain Routing</rt></ruby>CIDR中的 `255.255.255.0``/24`
为了使得你的更改生效,你需要通过停止再重新启用该连接。下面的第一个命令是停用该连接,第二个命令则是启用它: 为了使得你的更改生效,你需要通过停止再重新启用该连接。下面的第一个命令是停用该连接,第二个命令则是启用它:
@ -130,15 +130,15 @@ $ nmcli connection up ethernet-enp0s8
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/6) Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/6)
``` ```
假如你想将连接设置为使用 DHCP则需要将上面的 manual` 改为 `auto` 假如你想将连接设置为使用 DHCP则需要将上面的 `manual` 改为 `auto`(自动)
``` ```
`$ nmcli connection modify ethernet-enp0s8 ipv4.method auto` $ nmcli connection modify ethernet-enp0s8 ipv4.method auto
``` ```
### 设备管理 ### 设备管理
nmcli 命令中的 `device` 子命令允许你管理安装在你电脑中的网络接口。 `nmcli` 命令中的 `device` 子命令允许你管理安装在你电脑中的网络接口。
#### 检查设备状态 #### 检查设备状态
@ -155,9 +155,9 @@ lo      loopback  unmanaged  --  
#### 显示设备详情 #### 显示设备详情
为了检查某个网络接口的详情,可以使用 `device` 设备中的 `show` 操作。假如你不提供某个设备的名称,那么所有设备的详情都将会被获取再进行展示。你可以上下翻动来查看这些信息。 为了检查某个网络接口的详情,可以使用 `device` 子命令中的 `show` 操作。假如你不提供某个设备的名称,那么会获取并展示所有设备的详情。你可以上下翻动来查看这些信息。
要查看你最近添加的连接所对应的设备 `enp0s8`,你可以使用下面的命令,请注意验证它使用的 IP 地址是否为先前你请求的那个: 要查看你最近添加的连接所对应的设备 `enp0s8`,你可以使用下面的命令,请注意验证它使用的 IP 地址是否为先前你要求设置的那个:
``` ```
$ nmcli device show enp0s8 $ nmcli device show enp0s8
@ -182,23 +182,23 @@ IP6.ROUTE[2]:                           dst = ff00::/8, nh = ::, mt
* **网络接口名称**,在这个示例中是 `enp0s8`,它是 [udev][15] 分配的 * **网络接口名称**,在这个示例中是 `enp0s8`,它是 [udev][15] 分配的
* **网络连接类型**,在这个示例中是物理的 Ethernet 连接 * **网络连接类型**,在这个示例中是物理的 Ethernet 连接
* 设备的 **媒体访问控制MAC地址**,它被用来在网络中识别该设备 * 设备的<ruby>媒介访问控制<rt>media access control</rt></ruby>MAC地址,它被用来在网络中识别该设备
* [最大传输单元][17],在单个传输中最大协议数据单位的大小,任何大于这个大小的数据将被分为多个包来进行传输 * [最大传输单元][17],在单个传输中最大协议数据单位的大小,任何大于这个大小的数据将被分为多个包来进行传输
* 该设备**当前已经处于连接状态** * 该设备**当前已经处于连接状态**
* 这个设备使用的连接名称是 `ethernet-enp0s8` * 这个设备使用的连接名称是 `ethernet-enp0s8`
* 这个设备使用的 IP 地址如上面所求的那样,被设置为 `192.168.4.26/24` * 这个设备使用的 IP 地址如上面所求的那样,被设置为 `192.168.4.26/24`
其他的信息则是与这个设备连接的网络相关的默认路由和网关设置信息。 其他的信息则是与这个设备连接的网络相关的默认路由和网关设置信息。
#### nmcli 的交互式编辑器 #### nmcli 的交互式编辑器
尽管 nmcli 是一个命令行工具,但它还包含一个交互式工具, `edit` 子命令将为你指定的连接打开一个交互式编辑器,例如: 尽管 `nmcli` 是一个命令行工具,但它还包含一个基本的交互式编辑器,`edit` 子命令将为你指定的连接打开一个交互式编辑器,例如:
``` ```
$ nmcli connection edit ethernet-enp0s8 $ nmcli connection edit ethernet-enp0s8
``` ```
它将显示少量的帮助文字,接着是 nmcli 的命令提示符: 它将显示少量的帮助文字,接着是 `nmcli` 的命令提示符:
``` ```
===| nmcli interactive connection editor |=== ===| nmcli interactive connection editor |===
@ -213,7 +213,7 @@ You may edit the following settings: connection, 802-3-ethernet (ethernet), 802-
nmcli> nmcli>
``` ```
假如你输入 `print` 然后敲击 **Enter** 键, nmcli 将列举出与这个接口相关的所有属性。这些属性有很多,你可以上下翻动来查看这个列表: 假如你输入 `print` 然后敲击 `Enter` 键, `nmcli` 将列举出与这个接口相关的所有属性。这些属性有很多,你可以上下翻动来查看这个列表:
``` ```
=============================================================================== ===============================================================================
@ -239,7 +239,7 @@ connection.autoconnect-slaves:          -1 (default)
connection.secondaries:                 -- connection.secondaries:                 --
``` ```
如果你想将你的连接改为 DHCP则请输入 `goto ipv4` 然后敲 **Enter**键: 如果你想将你的连接改为 DHCP则请输入 `goto ipv4` 然后敲 `Enter` 键:
``` ```
nmcli> goto ipv4 nmcli> goto ipv4
@ -247,14 +247,14 @@ You may edit the following properties: method, dns, dns-search, dns-options, dns
nmcli ipv4> nmcli ipv4>
``` ```
你想改变的属性是 `method`,再继续敲 `set method auto` 然后敲 **Enter** 键: 你想改变的属性是 `method`,再继续敲 `set method auto` 然后敲 `Enter` 键:
``` ```
nmcli ipv4> set method auto nmcli ipv4> set method auto
Do you also want to clear 'ipv4.addresses'? [yes]: Do you also want to clear 'ipv4.addresses'? [yes]:
``` ```
假如你想让这个连接清除掉这个静态 IP 地址,则请敲 **Enter**键,如果要保留,则输入 `no` 然后敲 **Enter**键。假如你想在将来再次使用它,你可以保留这个 IP 地址。即便存储了一个静态的 IP 地址,如果 `method` 被设置为 `auto` ,它仍然会使用 DHCP。 假如你想让这个连接清除掉这个静态 IP 地址,则请敲 `Enter` 键,如果要保留,则输入 `no` 然后敲 `Enter` 键。假如你想在将来再次使用它,你可以保留这个 IP 地址。即便存储了一个静态的 IP 地址,如果 `method` 被设置为 `auto` ,它仍然会使用 DHCP。
最后输入 `save` 来保存你的更改: 最后输入 `save` 来保存你的更改:
@ -264,13 +264,13 @@ Connection 'ethernet-enp0s8' (09d26960-25a0-440f-8b20-c684d7adc2f5) successfully
nmcli ipv4> nmcli ipv4>
``` ```
输入 `quit` 来离开 nmcli 的交互式编辑器窗口。假如你不想离开,可以输入 `back` 来回到最开始的命令行提示符界面,然后继续使用这个编辑器。 输入 `quit` 来离开 `nmcli` 的交互式编辑器窗口。假如你不想离开,可以输入 `back` 来回到最开始的命令行提示符界面,然后继续使用这个编辑器。
### nmcli 的更多内容 ### nmcli 的更多内容
浏览交互式编辑器,你就可以看到 nmcli 有多少设定和每个设定有多少属性。交互式编辑器是一个简洁的工具,但如果需要在命令行或者在脚本中使用 nmcli你还是需要使用常规的命令行版本。 浏览交互式编辑器,你就可以看到 `nmcli` 有多少设定和每个设定有多少属性。交互式编辑器是一个简洁的工具,但如果需要在命令行或者在脚本中使用 `nmcli`,你还是需要使用常规的命令行版本。
现在你有了这些基础知识,你还可以查看 nmcli 的 [man 页面][2] 来查看它还可以提供什么额外功能。 现在你有了这些基础知识,你还可以查看 `nmcli` 的 [man 页面][2] 来查看它还可以提供什么更多功能。
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
@ -279,7 +279,7 @@ via: https://opensource.com/article/20/7/nmcli
作者:[Dave McKay][a] 作者:[Dave McKay][a]
选题:[lujun9972][b] 选题:[lujun9972][b]
译者:[FSSLC](https://github.com/FSSlc) 译者:[FSSLC](https://github.com/FSSlc)
校对:[校对者ID](https://github.com/校对者ID) 校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出