在命令行中使用nmcli來管理網(wǎng)絡(luò)連接
nmcli 命令賦予你直接在 Linux 命令行操作 NetworkManager 工具的能力。
nmcli 命令賦予你直接在 Linux 命令行操作 NetworkManager 工具的能力。它是 NetworkManager 軟件包集成的一部分,通過使用一些 應(yīng)用程序接口(API)來獲取 NetworkManager 的功能。
nmcli
發(fā)布于 2010 年,用以替代其他配置網(wǎng)絡(luò)接口和連接的方法,例如 ifconfig。因為它是一個 命令行界面(CLI)工具,被設(shè)計用在終端窗口和腳本中,所以對于那些工作在沒有 圖形用戶界面(GUI)的系統(tǒng)的管理員來說,它是一個非常理想的工具。
ncmli 的語法
nmcli
命令可以使用選項來更改它的行為,使用子命令來告訴 nmcli
想使用它的那部分功能,使用操作來告訴 nmcli
你想執(zhí)行什么操作。
$ nmcli <選項> <子命令> <操作>
nmcli
一共有 8 個子命令,每個子命令有一些相關(guān)的網(wǎng)絡(luò)操作:
help
提供有關(guān)nmcli
命令和使用方法的幫助信息general
返回 NetworkManager 的狀態(tài)和總體配置信息networking
提供命令來查詢某個網(wǎng)絡(luò)連接的狀態(tài)和啟動、禁用連接的功能radio
提供命令來查詢某個 WiFi 網(wǎng)絡(luò)連接的狀態(tài)和啟動、禁用連接的功能monitor
提供命令來監(jiān)控 NetworkManager 的活動并觀察網(wǎng)絡(luò)連接的狀態(tài)改變connection
提供命令來啟用或禁用網(wǎng)絡(luò)接口、添加新的連接、刪除已有連接等功能device
主要被用于更改與某個設(shè)備(例如接口名稱)相關(guān)聯(lián)的連接參數(shù)或者使用一個已有的連接來連接設(shè)備secret
注冊nmcli
來作為一個 NetworkManager 的秘密代理,用以監(jiān)聽秘密信息。這個子命令很少會被用到,因為當(dāng)連接到網(wǎng)絡(luò)時,nmcli
會自動做這些事
簡單的示例
首先,我們驗證一下 NetworkManager 正在運行并且 nmcli
可以與之通信:
$ nmcli general
STATE CONNECTIVITY WIFI-HW WIFI WWAN-HW WWAN
connected full enabled enabled enabled enabled
探測總是管理一個系統(tǒng)的首要部分。為了列出內(nèi)存或磁盤上的網(wǎng)絡(luò)連接配置,可以使用下面的命令:
$ 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 個網(wǎng)絡(luò)適配器:enp0s3
、enp0s8
和 enp0s9
。
連接管理
理解 nmcli
的術(shù)語是非常重要的。一個網(wǎng)絡(luò)連接包含了一個連接的所有信息。你可以將它看作一個網(wǎng)絡(luò)配置。“連接”包含了與其相關(guān)的所有信息,包括 數(shù)據(jù)鏈路層 和 IP 地址信息 。它們是 OSI 網(wǎng)絡(luò)模型 中的第 2 和第 3 層。
當(dāng)你在 Linux 上配置網(wǎng)絡(luò)時,通常來說你是在為某個網(wǎng)絡(luò)設(shè)備(它們是安裝在一個電腦中的網(wǎng)絡(luò)接口)配置連接。當(dāng)一個連接被某個設(shè)備所使用,那么就可以說這個連接被激活或者上線了,反之是停用或下線。
添加網(wǎng)絡(luò)連接
nmcli
允許你快速地創(chuàng)建網(wǎng)絡(luò)連接并同時為該連接指定參數(shù)。為了通過使用“有線連接 2” enp0s8
來創(chuàng)建一個新的連接,你可以利用 sudo
來運行下面的命令:
$ sudo nmcli connection add type ethernet ifname enp0s8
Connection 'ethernet-enp0s8' (09d26960-25a0-440f-8b20-c684d7adc2f5) successfully added.
其中 type
選項指定需要一個 Ethernet 類型的連接,而 ifname
(接口名)選項指定你想要為這個連接使用的網(wǎng)絡(luò)接口設(shè)備。
讓我們看看發(fā)生了什么變化:
$ 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
已經(jīng)創(chuàng)建好了。它的 通用唯一標(biāo)識符(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
現(xiàn)在已經(jīng)被激活了,并且與 enp0s8
網(wǎng)絡(luò)接口設(shè)備綁定。
調(diào)整連接
nmcli
命令使得調(diào)整現(xiàn)有連接的參數(shù)變得更加容易。也許你想將某個網(wǎng)絡(luò)接口從 動態(tài)主機配置協(xié)議(DHCP)改為靜態(tài) IP 地址。
假設(shè)你需要為你的新連接分配一個固定的 IP 地址 192.168.4.26
,那么你需要使用兩個命令,一個用于設(shè)定 IP 地址,另一個用來將獲取 IP 地址的方法改為 manual
(手動):
$ nmcli connection modify ethernet-enp0s8 ipv4.address 192.168.4.26/24
$ nmcli connection modify ethernet-enp0s8 ipv4.method manual
記得指定 子網(wǎng)掩碼,在我們這個測試的連接中,它是 無類域間路由(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)
假如你想將連接設(shè)置為使用 DHCP,則需要將上面的 manual
改為 auto
(自動):
$ nmcli connection modify ethernet-enp0s8 ipv4.method auto
設(shè)備管理
nmcli
命令中的 device
子命令允許你管理安裝在你電腦中的網(wǎng)絡(luò)接口。
檢查設(shè)備狀態(tài)
可以使用下面的命令來快速檢查所有網(wǎng)絡(luò)接口的狀態(tài):
$ 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 --
顯示設(shè)備詳情
為了檢查某個網(wǎng)絡(luò)接口的詳情,可以使用 device
子命令中的 show
操作。假如你不提供某個設(shè)備的名稱,那么會獲取并展示所有設(shè)備的詳情。你可以上下翻動來查看這些信息。
要查看你最近添加的連接所對應(yīng)的設(shè)備 enp0s8
,你可以使用下面的命令,請注意驗證它使用的 IP 地址是否為先前你要求設(shè)置的那個:
$ 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
上面的輸出非常細(xì)致,它主要顯示了下面這些內(nèi)容:
- 網(wǎng)絡(luò)接口名稱,在這個示例中是
enp0s8
,它是 udev 分配的 - 網(wǎng)絡(luò)連接類型,在這個示例中是物理的 Ethernet 連接
- 設(shè)備的媒介訪問控制(MAC)地址,它被用來在網(wǎng)絡(luò)中識別該設(shè)備
- 最大傳輸單元,在單個傳輸中最大協(xié)議數(shù)據(jù)單位的大小,任何大于這個大小的數(shù)據(jù)將被分為多個包來進(jìn)行傳輸
- 該設(shè)備當(dāng)前已經(jīng)處于連接狀態(tài)
- 這個設(shè)備使用的連接名稱是
ethernet-enp0s8
- 這個設(shè)備使用的 IP 地址如上面所要求的那樣,被設(shè)置為
192.168.4.26/24
其他的信息則是與這個設(shè)備連接的網(wǎng)絡(luò)相關(guān)的默認(rèn)路由和網(wǎng)關(guān)設(shè)置信息。
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 [<setting>.<prop>]' 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>
假如你輸入 print
然后敲擊 Enter
鍵, nmcli
將列舉出與這個接口相關(guān)的所有屬性。這些屬性有很多,你可以上下翻動來查看這個列表:
===============================================================================
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
,再繼續(xù)敲 set method auto
然后敲 Enter
鍵:
nmcli ipv4> set method auto
Do you also want to clear 'ipv4.addresses'? [yes]:
假如你想讓這個連接清除掉這個靜態(tài) IP 地址,則請敲 Enter
鍵,如果要保留,則輸入 no
然后敲 Enter
鍵。假如你想在將來再次使用它,你可以保留這個 IP 地址。即便存儲了一個靜態(tài)的 IP 地址,如果 method
被設(shè)置為 auto
,它仍然會使用 DHCP。
最后輸入 save
來保存你的更改:
nmcli ipv4> save
Connection 'ethernet-enp0s8' (09d26960-25a0-440f-8b20-c684d7adc2f5) successfully updated.
nmcli ipv4>
輸入 quit
來離開 nmcli
的交互式編輯器窗口。假如你不想離開,可以輸入 back
來回到最開始的命令行提示符界面,然后繼續(xù)使用這個編輯器。
nmcli 的更多內(nèi)容
瀏覽交互式編輯器,你就可以看到 nmcli
有多少設(shè)定和每個設(shè)定有多少屬性。交互式編輯器是一個簡潔的工具,但如果需要在命令行或者在腳本中使用 nmcli
,你還是需要使用常規(guī)的命令行版本。
現(xiàn)在你有了這些基礎(chǔ)知識,你還可以查看 nmcli
的 man 頁面 來查看它還可以提供什么更多功能。