一、前言
NetworkManager是Linux系统中用于管理网络连接和配置的重要工具和万金油。而nmcli是NetworkManager最为强大的CLI版本管理工具,其图形化管理工具为nmtui,基于dialog实现的交互更适合新手使用,nmcli更适合非交互式的管理配置,通过几条命令就能搞定网络,因此常用于各种自动化脚本里,无需人工干预。
本文将详细介绍nmcli的使用案例以及海量的参数说明,从常规项、网络控制、无线传输控制、连接管理、设备管理等多个维度深度剖析nmcli。
二、用法案例及参数说明
2.1 常规项(general)
2.1.1 统计网络整体状态(status)
status用来显示NetworkManager的整体状态,或者缺省status,效果也是一样:
nmcli general
nmcli general status
输出了7个字段,分别是:
-
STATE: 网络管理器的状态,这里的connected表示网络已连接。
-
CONNECTIVITY: 连接状态,full表示完全连接,即设备可以访问互联网。
-
WIFI-HW: 无线网络硬件状态,enabled表示无线网络硬件已启用。
-
WIFI: 无线网络服务状态,enabled表示无线网络服务已启用。
-
WWAN-HW: 无线广域网硬件状态,missing表示没有检测到无线广域网硬件。
-
WWAN: 无线广域网服务状态,enabled表示无线广域网服务已启用。
-
METERED: 是否为计量网络,no (guessed)表示系统猜测这不是一个计量网络。
2.1.2 获取并更改系统主机名(hostname)
当hostname后面没有接其它参数时,只打印当前的主机名:
nmcli general hostname
当后面接新的主机名后,nmcli会修改当前主机名为新主机名,比如修改主机名为rokas:
nmcli general hostname rokas
2.1.3 展示当前调用用户的权限(permissions)
permissions将展示当前调用者对NetworkManager的各种身份验证的操作权限,比如启用/禁用网络、更改主机名、更改DNS等。
nmcli general permissions
可以看到,当前普通用户对于部分权限,需要经过身份验证(auth),加上sudo后则拥有完整权限。
比如需改hostname时,需要输入root的密码进行授权操作。
2.1.4 重载配置(reload)
reload参数将重新加载NetworkManager的配置并执行某些更新,比如刷新缓存或将外部状态重写到硬盘,类似于给NetworkManager发送一个SIGHUP信号,也允许通过flags参数对重载的内容进行更细粒度的控制,reload后面支持的flags参数包括:
flag | 含义 |
---|---|
conf | 从硬盘重载Networkmanager.conf配置 |
dns-rc | 更新DNS配置,通常涉及重新写入/etc/resolv.conf,等同于给NetworkManager发送SIGUSER1信号 |
dns-full | 重启DNS插件,比如dnsmasq |
reload后面如果没有接上述任何flag,所有支持的内容都会被重载。
因此,重载整个NetworkManager可以是:
nmcli general reload
更细粒度的控制,只重载配置文件,可以是:
nmcli general reload conf
2.2 网络控制(networking)
2.2.1 启用/禁用网络(on/off)
on、off这两个参数通过NetworkManager来控制网络的启停,当禁用网络时,NetworkManager所管理的所有接口都将停用。
禁用网络:
nmcli networking off
可以看到右下角的弹窗以及终端中的status,此时NetworkManager停止了所有接口。
启用网络:
nmcli networking on
启用网络后,网络状态从disconnected转向为connected。
2.2.2 获取网络连接状态(connectivity)
获取网络连接状态,后面可选接check参数,告诉NetworkManager重新检查连接,否则为已知的最新连接
显示连接状态。
nmcli networking connectivity
输出的状态包括以下5种:
- none:主机未连接任何网络。
- portal:主机位于一个专属门户后,无法访问整个互联网。
- limited:主机已连接网络,但无法访问互联网。
- full:主机已连接网络,并且可以完全访问互联网。
- unknown:不确定状态。
2.3 无线传输控制(radio)
raido选项用来展示无线网络的开关状态,或者启用或禁用无线网络。
2.3.1 启用/禁用WiFi(wifi on|off)
启用wifi:
nmcli radio wifi on
禁用wifi:
nmcli radio wifi off
当不接on和off时,会输出当前的wifi状态。
2.3.2 启用/禁用移动宽带(wwan on|off)
移动宽带也可以称之为移动广域网,注意这里指的不是移动运营商,比如3G、4G、5G等蜂窝数据通信,都属于wwan(Wireless Wide Area Network)参数的管理范畴,当你的设备是通过sim卡上网时,则可以通过wwan来进行开关。
启用移动宽带:
nmcli radio wwan on
禁用移动宽带:
nmcli radio wwan off
同理,wwan后面不接参数时,将打印当前状态。
2.3.3 启用/禁用所有无线开关(all on|off)
all参数将批量管理上面提到的WiFi开关、移动宽带开关。
启用所有无线开关:
nmcli radio all on
禁用所有无线开关:
nmcli radio all off
查看所有无线开关状态:
nmcli radio all
2.4 连接管理(connection)
2.4.1 打印连接状态(show)
show选项会打印当前主机的连接状态信息,包括已连接和未连接状态。
nmcli connection show
而如果加上–active参数则只展示已连接的接口状态:
也可以进行缩写的写法:
nmcli con show
nmcli c s
2.4.2 对连接状态进行排序(–order)
show后面接–order参数则可以实现排序,排序有下面几种方式:
参数 | 含义 |
---|---|
active | 按活动状态排序 |
name | 按名称排序 |
type | 按类型排序 |
path | 按D-Bus路径排序 |
+ | 默认行为,升序排序 |
– | 逆序(降序)排序 |
比如,按活动状态排序,可以是:
nmcli connection show --order active
因为WiFi是关闭状态,因此排在最后。
按照类型进行升序排序或逆序排序分别是:
nmcli connection show --order +type
nmcli connection show --order -type
第一个命令的+type也可以写成type,省略+号,因为+号是默认行为。
同时,类别名称可以缩写,比如先按照活动状态进行逆序排序,再按照名字进行升序排序可以是:
nmcli connection show --order -a:na
-a缩写对应-active,na对应name,效果一样。
2.4.3 打印指定连接的更多信息
当需要查询其中某个连接的更多信息时,后面可以接连接的id、uuid、path、apath信息,含义如下:
- id:连接名称;
- uuid:连接的UUID;
- path:D-Bus静态连接路径,格式为/org/freedesktop/NetworkManager/Settings/num或者直接写num;
- apath:D-Bus活动连接路径,格式为/org/freedesktop/NetworkManager/ActiveConnection/num或者直接写num。
比如打印主机连接的WiFi信息细节,通过WiFi名称来指定要查询的WiFi:
nmcli connection show --active 'WiFi名'
如果你想查看连接密码,则可以加上–show-secrets全局参数,并且找到psk字段,就是我们的WiFi密码:
nmcli connection show --active 'WiFi名' --show-secrets |grep psk:
2.4.4 启用连接(up)
up选项用来启用连接,后面可接连接的名称、UUID、D-Bus路径,选其一即可。
注意这里和上面所说的radio开关控制以及networking的开关控制不太一样,这两个可以理解为控制接口的状态,而connection的up则用来控制具体连接的状态,即在有线连接的情况下,用户可以选择disconnect,而不需要禁用整个有线接口,无线连接的情况下,用户可以选择disconnect,而无需简单粗暴关闭WiFi。
示例1:通过WiFi名启用连接
nmcli connection up 'WiFi名'
因为之前连接过此WiFi,没有删除密码的情况再次重连,因此无需密码自动可以连接上。
示例2:通过UUID启用连接,并交互输入密码或指定密码
一些网络在激活期间可能需要凭证,如需使用密码,可以通过–ask进行交互输入:
nmcli con up 'UUID' --ask #con是connection的缩写,UUID也能替换为WiFi名
或者后面接passwd-file指定密码文件,密码文件的每一行都包含一个密码,格式为:setting_name.property_name:the password
比如,如果是带PSK的WPA WiFi,可以写成:
802-11-wireless-security.psk:secret12345
如果是802.1X密码,可以写成:
802-1x.password:my 1X password
基于如上说明,我们的密码文件内容如下:
$ cat /home/rokas/psk_passwd
802-11-wireless-security.psk:mypassword
之后通过passwd-file指定密码文件便可成功连接:
nmcli con up 'UUID' passwd-file /home/rokas/psk_passwd
2.4.5 禁用连接(down)
禁用连接和启用连接,可接参数基本一致,后面可接连接的名称、UUID、D-Bus路径,选其一即可。
选项 | 含义 |
---|---|
id | 连接名称 |
uuid | 连接的uuid |
path | D-Bus静态连接路径,格式为/org/freedesktop/NetworkManager/Settings/num或者直接写num |
apth | D-Bus活动连接路径,格式为/org/freedesktop/NetworkManager/ActiveConnection/num或者直接写num |
示例1:通过id名称禁用连接
nmcli connection down '连接id'
示例2:通过UUID禁用连接,并且设置超时时间为5秒
nmcli --wait 5 connection down 'uuid‘
如果不指定–wait,默认等待超时时间为10秒。
2.4.6 指定属性创建新连接(add)
通过入参指定属性来创建新连接,通过man nm-settings-nmcli
可以查阅到完整的属性说明。
比如连接的类型可以通过手册进行查阅:
man nm-settings-nmcli|grep -A 10 -P '^\s*connection.type$'
支持的类型有:6lowpan, 802-11-olpc-mesh, 802-11-wireless, 802-3-ethernet, adsl, bluetooth, bond, bridge, cdma, dummy, generic, gsm, hsr, infiniband, ip-tunnel, loopback, macsec, macvlan, ovs-bridge, ovs-dpdk, ovs-interface, ovs-patch, ovs-port, pppoe, team, tun, veth, vlan, vpn, vrf, vxlan, wifi-p2p, wimax, wireguard, wpan。
同时,各个属性值也支持别名的方式,比如connection.id的别名con-name,connection.type的别名是type,connection.interface-name的别名是ifname,通过man文档可以直接查阅到各个属性值:
man nm-settings-nmcli |grep -A 1 -P '^\s*connection.(type|id|name|interface-name)$'
其他属性值别名和介绍不一一举例,关于属性值设置等参数介绍的man文档目前就有5000多行。
示例1:添加DHCP的有线连接
nmcli connection add type eth con-name dhcp-wired-enp6s0 ifname enp6s0
正如上面所说,type是网络类型的别名,eth是802-3-ethernet的别名,con-name是连接名的别名,ifname是物理接口的别名。可以看到show命令输出的最后一行连接,就是我们添加的连接配置,这个连接配置文件路径在/etc/NetWorkManager/system-connections路径下,通过man nm-settings-nmcli可以查阅具体的存储路径,这里使用的发行版为archlinux,不同的发行版路径可能会有所区别。
添加连接后,网络管理设置多出了添加连接配置:
是否存储配置文件到硬盘上,实际是通过save参数来实现,save后可选yes或no,没有save的情况默认都是yes,如果不想存储配置文件到硬盘则接no,比如上面的命令可以修改为:
nmcli connection add save no type eth con-name dhcp-wired-enp6s0 ifname enp6s0
如需启用这个连接,参照 2.4.4 的方式进行up即可,比如:
nmcli con up 'dhcp-wired-enp6s0'
示例2:添加静态IP的有线连接
添加一个如下配置的静态连接:
客户端IP | 掩码 | 网关 | DNS |
---|---|---|---|
192.168.1.123 | 255.255.255.0 | 192.168.1.1 | 192.168.1.72,192.168.1.1 |
写法可以是:
nmcli con add type eth con-name static-wired-enp6s0 ifname enp6s0 ip4 192.168.1.123/24 gw4 192.168.1.1 ipv4.dns "192.168.1.72 192.168.1.1"
nmcli con up static-wired-enp6s0 # 重新激活连接
2.4.7 增删改连接配置文件中的属性(modify)
modify用来修改任意一个连接的属性值,因此,指定修改连接,入口也有三种:
选项 | 含义 |
---|---|
id | 连接名称 |
uuid | 连接的uuid |
path | D-Bus静态连接路径,格式为/org/freedesktop/NetworkManager/Settings/num或者直接写num |
要设置属性,只需指定属性名称和值。空值("")将属性值重置为默认值。
属性值也是通过nm-settings-nmcli的man手册进行查阅:
man nm-settings-nmcli
示例1:添加IP地址
在已有的基础上,增加一个192.168.1.3的IP:
nmcli connection modify static-wired-enp6s0 ip4 "192.168.1.3/24"
nmcli con up static-wired-enp6s0 # 触发修改后使用up重新激活后生效
示例2:删除指定IP
将第一个IP地址删除,可以是:
nmcli connection modify static-wired-enp6s0 -ipv4.addresses 0
nmcli con up static-wired-enp6s0
–号是删除属性元素的意思,0是属性值的索引值,从0开始计数。
示例3:附加/删除DNS地址
将当前连接配置的DNS附加119.29.29.29和114.114.114.114,可以是:
nmcli connection modify static-wired-enp6s0 ipv4.dns "119.29.29.29 114.114.114.114"
nmcli con up static-wired-enp6s0
可以看到直接写入的是/etc/resolv.conf。
同理如需删除指定DNS,可以用索引,也可以指定具体的IP,比如删除114 DNS,用索引是:
nmcli con mod static-wired-enp6s0 -ipv4.dns 1
需要说明下,为什么删除索引的第二个元素,不是119 DNS,而是114 DNS,因为上面附加DNS时,一次性附加了两个DNS:114和119,这两个元素才有索引的概念,在此之外的DNS并不在作用范围内,即192.168.1.1并不在作用范围。
示例4:清空配置文件中的某项特定属性设置
这里移除的属性是大的属性设置,ipv4.dns、ipv4.gateway、connection.id是具体的属性,而remove后面只能接大的属性设置,把整个前缀的属性全部移除,比如ipv4、ipv6、connection等。有些属性是必须参数,无法被移除,每个网络类型不一样,必须参数也不一样。
移除整个ipv4设置:
nmcli connection modify static-wired-enp6s0 remove ipv4
针对以上连接配置,包含ipv4的所有属性值都会被清空,可以看到ipv4包含的属性有下面这些:
针对remove操作,nmcli还提供了–temporary参数来临时操作,只影响当前连接,重启连接配置或者重启up后,则恢复,比如临时移除ipv6的全部属性值:
nmcli connection modify --temporary static-wired-enp6s0 remove ipv4
因此,此操作范围和风险较大,操作之前确保知道自己在做什么,或者最好加上--temporary临时参数,让它有回滚的能力,否则只建议移除单个属性值,而非清空整个大的属性设置。
2.4.8 交互式编辑现有连接或添加新连接(edit)
edit后面可以接id、uuid、path来指定编辑现有连接,如果三者都不接,则视为新增一个连接配置。
示例1:修改现有的连接
edit后接连接名称来修改现有的连接:
nmcli connection edit static-wired-enp6s0
此时nmcli弹出了一个交互式的shell,里面有各个子命令和选项参数,键入help或者‘?’可以看到帮助内容。
这里修改此连接的IPv4地址、网关、dns为例:
各个属性值可以通过tab补全,完整的属性值可通过man nm-settings-nmcli进行查阅。
示例2:添加一个新连接
前面说过,edit也能添加新连接,并且有交互式的能力,后面不接任何连接id即可新增连接,这里新增一个dhcp的连接为例:
$ nmcli connection edit
nmcli> set connection.id newconn-dhcp-enp6s0
nmcli> set ipv4.method auto
nmcli> set connection.interface-name enp6s0
nmcli> verify fix
Verify connection: OK
nmcli> save
Saving the connection with 'autoconnect=yes'. That might result in an immediate activation of the connection.
Do you still want to save? (yes/no) [yes] yes
Connection 'newconn-dhcp-enp6s0' (6653e34a-d18b-499e-90a0-581ee83aa611) successfully saved.
nmcli> quit
可以看到上述截图,第一个交互是需要你确认连接类型,这里输入了eth,即802-3-ethernet的缩写。如果并不想在这里进行交互,实际edit也提供了两个参数,用来预指定类型(type)和接口名(connection.id),因此上面的写法可以优化为:
nmcli connection edit type eth con-name newconn-dhcp-enp6s0
添加新连接后,如需激活此连接执行up即可,连接启用后,ip地址为自动获取,获取到了192.168.1.3,并且ping外网正常:
nmcli connection up newconn-dhcp-enp6s0
更多示例,可以通过man nmcli-examples进行查阅。
2.4.9 克隆连接(clone)
想要将一个连接克隆一份作为冗余备份或者是在此基础上克隆一份作为二次修改的模板,都会用到克隆功能。
按照惯例,后面也是指定连接的三要素:id、uuid、path,选其一即可,需要clone哪个连接就指定哪个连接。
示例:克隆一份WiFi连接
克隆一份WiFi连接,并且给一个名字:
nmcli con clone '被克隆的WiFi名‘ 'wifi-copy'
尝试通过up来启用它:
nmcli con up wifi-copy
成功连接,侧面说明WiFi密码也无一例外被克隆了过来。
2.4.10 删除连接(delete)
删除指定连接的三要素:id、uuid、path,选其一即可。
示例:删除指定连接
nmcli connection delete '连接id'
可以看到,删除后,连接配置文件也不复存在。如果没有指定–wait超时参数,delete操作的默认删除超时时间为10s。
2.4.11 重载连接(reload)
此操作将从硬盘重载所有连接配置文件。NetworkManager不会监视连接的改动,所以如果你修改了任何连接配置,需要使用这个命令来告诉NetworkManager,让NetworkManager从磁盘重新读取连接配置文件。
reload后面没有任何参数,上述所有的修改连接的操作,如需生效,都可以使用reload来进行重载,而无需进行二次up,重载操作默认需要root授权:
sudo nmcli connection reload
2.4.12 从硬盘加载或重载连接配置(load)
此功能适合于直接去修改配置文件的情况下,通过load去载入此次的修改,让NetworkManager知道其
最新状态。
比如下面这个示例,我们手动修改配置文件后,让NetworkManager知道它已经被我们改动了:
sudo nmcli con load /etc/NetworkManager/system-connections/static-wired-enp6s0.nmconnection
sudo nmcli con reload /etc/NetworkManager/system-connections/static-wired-enp6s0.nmconnection
这里的reload是重载配置文件的意思,并非启用这个连接配置文件,如需启用还需进行up。
2.5 设备管理(device)
设备管理用于直接展示和管理网络接口。
2.5.1 打印设备状态(status)
status可缺省,缺省情况下默认也是执行status的操作:
nmcli device
2.5.2 打印设备的细节(show)
show后面可以接具体的设备名,缺省状态下默认打印所有设备细节。
下面的示例,打印了有线网卡和无线网卡两个设备细节:
nmcli dev show <设备名>
输出内容包括一些通用参数:设备类型、MAC地址、MTU大小、设备状态、对应的连接id、IPv4/IPv6等相关设置以及路由信息等。
2.5.3 设置设备属性(set)
set可以设置设备是否自动连接(autoconnect)以及是否被NetworkManager进行管理(managed),格式为:
set [ifname] ifname [autoconnect {yes | no}] [managed {yes | no}]
示例1:开启WiFi自连接
给无线网卡wlp4s0设置自动连接,当启用WiFi后会优先自动连接最近使用过的wifi:
nmcli device set <网卡名> autoconnect yes
示例2:让网卡不被NetworkManager管理
把网卡从NetworkManager踢出,在有其它网络管理工具来接管这个设备的场景下较为有用,比如容器场景,主机网络配置和容器网络配置可能会产生冲突,容器网络使用了自定义的网络插件来管理网络连接和IP分配,如果主机的NetworkManager同时管理着所有网卡,可能会导致网络配置混乱,因此尽量让容器网络能够独立地进行网络配置和管理。
把某个网卡从NetworkManager踢出:
nmcli dev set <网卡名> managed no
当系统中有多张网卡,且不同网卡需要由不同的网络管理工具或方式进行管理时,此方式常用。
2.5.4 启用设备(up/connect)
NetworkManager会去尝试找到将被激活的合适连接,它还会考虑激活没有设置自动连接(autoconnect no)的连接,如果这个设备当前不存在任何兼容的连接,将创建并激活具有默认设置的新配置文件。
比如下面这个示例,首先通过如下命令,将无线网卡设置为了不自动连接:
nmcli device set <设备名> autoconnect no
之后直接启用无线网卡设备,可以看到无线网卡对应的连接也被自动up了,尽管上条命令设置了不自动连接:
nmcli dev up <设备名>
因此,启用设备和启用连接,需要区分开:
nmcli connection up ifname "$DEVICE" # 启用匹配网卡名的连接
nmcli device up "$DEVICE" # 启用整个设备
如果没有指定–wait选项,默认超时时间是90s。
connect也可以启用设备,是up的别名写法,up在nmcli 1.34.0 之前不支持,则可以用connect,其它没什么区别:
nmcli dev connect <设备名>
2.5.5 重应用修改(reapply)
当修改过设备配置后,可以通过reapply来应用修改。
示例:修改连接后进行reapply
假设我们对其中一块网卡的其中一个连接进行DNS的修改:
nmcli connection modify <连接名> ipv4.dns "192.168.1.72 192.168.1.1"
之后便可以使用reapply来应用这次修改,让修改立即生效:
nmcli device reapply <设备名>
重应用后,可以看到/etc/resolv.conf文件得到了刷新。
2.5.6 修改设备属性(modify)
设备维度(device)的modify修改和前面 2.4.7 提到的连接维度(connection)的modify修改的主要区别是:
- 设备维度的修改,可以修改当前设备的活动连接配置,修改后立即生效,属于临时更改,不会永久保存到连接配置文件中;
- 连接维度的修改,修改具体的连接配置,可以是活动的连接配置,也可以是非活动连接配置,修改是否保存到连接配置文件是可选项(–temporary参数可实现临时修改),修改后需要重新up或reload生效。
除了以上区别,用法上基本一致,修改的属性值范围也一致,可通过man nm-settings-nmcli看具体的属性项,或者参照 2.4.7 更为详细的修改说明。
示例1: 添加/删除IP地址
看到这里,你应该已经知道添加一个IP地址在设备维度应该怎么写:
nmcli device modify <设备名> ip4 "192.168.1.123/24"
同理,删除一个IP地址,可以是:
nmcli dev mod <设备名> -ipv4.addresses "192.168.1.64"
可以看到,设备维度的modify直接对活动连接生效,不需要任何reload或up。
2.5.7 断开设备连接(down/disconnect)
断开设备连接,防止设备在没有用户或手动干预的情况下自动激活连接。需要注意,断开软件设备可能意味着这些设备将会消失。
down和disconnect都用于设备的断开,disconnect是down的别名形式,down在nmcli 1.34.0版本之前不可用,则可以用disconnect替代。
示例:断开无线网卡
首先可以通过如下命令展示所有设备:
nmcli device
之后断开无线网卡:
nmcli dev down <设备名>
如果未指定–wait选项,则默认超时为10秒。
2.5.8 删除设备(delete)
该命令从系统中直接删除设备,注意这里的 “设备” 是在网络管理的范畴内,指网络设备相关的接口。例如,它可以删除一些由软件定义的网络设备接口:“bond”(链路聚合设备)、“bridge”(网桥设备)、“team”(一种网络接口组合设备),这些设备一般是通过软件配置来创建和管理的,用于实现特定的网络功能,比如增加带宽(链路聚合)、连接不同网段(网桥)等。
示例:删除bond设备和bridge设备
nmcli device delete <设备名>
如果未指定–wait选项,则默认超时为10秒。
对于硬件设备,如以太网(Ethernet)接口,delete是无法删除的。这是因为硬件设备在系统底层的物理连接和内核驱动层面有其特殊性。硬件设备的存在是基于物理硬件的连接,其管理和配置与软件设备有所不同。
2.5.9 监控设备活动(monitor)
监控设备活动。每当指定的设备更改状态时,此命令都会打印一行。
设备维度的监控只关注设备状态的变更,变更后则会实时在屏幕输出变更状态,比如监控无线网卡的变更,启用无线网卡设备后,屏幕上会打印设备变更状态:
nmcli device monitor <设备名>
上图可以看到,对于设备添加IP地址的变更,monitor是不关注的,它只关注设备本身的状态(state)。
2.5.10 列出可用WiFi(wifi list)
列出可用的Wi-Fi接入点。后面可接ifname和bssid选项可用于分别列出特定接口或特定bssid的AP。
基本格式为:
wifi [list [--rescan | auto | no | yes] [ifname ifname] [bssid BSSID]]
示例1:列出可用WiFi
不接任何参数,或者接list,效果一样:
nmcli device wifi
nmcli device wifi list
示例2:重新扫描附近WiFi
默认情况下,nmcli在确认WiFi接入点列表时不会超过30秒,并在必要时触发网络扫描。–rescan可用于强制或禁用重新扫描,无论接入点列表是否是最新,都可以进行扫描。
nmcli dev wifi list --rescan yes
示例3:列出指定网卡和BSSID的WiFi
当有明确的BSSID时,可以通过指定网卡和BSSID,查找特定WiFi:
nmcli dev wifi list ifname <无线网卡> bssid <bssid>
2.5.11 连接WiFi(wifi connect)
通过指定SSID或BSSID连接到一个指定WiFi。该命令会查找匹配的连接或者创建一个新连接,然后在设备上激活它。这个命令对应的GUI操作:在GUI界面上鼠标单击WiFi进行连接。
格式为:
wifi connect (B)SSID [password password] [wep-key-type {key | phrase}] [ifname ifname] [bssid BSSID] [name name] [private {yes | no}] [hidden {yes | no}]
这个章节只讲如何首次连接WiFi,如果已存在连接配置,可跳到本文的 2.4.4章节 去看如何启用连接。
前缀格式为wifi connect (B)SSID,由此可见,可以通过SSID连接WiFi,也可以通过BSSID连接WiFi。后面可接的参数有:
参数 | 含义 |
---|---|
password | WiFi密码 |
wep-key-type | WEP密钥的类型,可选key或phrase |
ifname | 用于连接WiFi的无线网卡,如果有多块无线网卡,可以用此参数指定 |
bssid | 如果指定,则创建的连接将仅限于对应BSSID |
name | 连接名(非WiFi名,不指定NM本身会创建一个名称) |
private | 如果设置为yes,则连接仅对创建它的用户可见,否则连接默认能被系统所有用户看到 |
hidden | 设置yes可连接隐藏的WiFi |
连接WiFi之前,先确保WiFi开关已经打开:
nmcli radio wifi #查询无线网络控制是否启用
nmcli radio wifi on # 启用WiFi
上述操作可参照本文 2.2.1 章节。
示例1:交互式连接WiFi
–ask参数可以交互式输入密码连接WiFi,这里通过指定WiFi名(SSID)为例:
nmcli dev wifi connect '<SSID>' --ask
当然也可以指定BSSID:
nmcli dev wifi connect '<BSSID>' --ask
示例2:通过密码连接WiFi
通过密码连接WiFi:
nmcli dev wifi connect <SSID> password 'mypassword'
注意,这里讲的是首次连接WiFi,即当前连接配置文件中没有被连接WiFi的连接配置,此时nmcli会去创建一个连接配置文件,并把你入参的ssid和password填充到连接配置文件。
如果非首次连接(只算成功连接上的次数),会存在已有的连接配置,可以通过如下命令来查看:
nmcli connection show
已有连接配置的情况下,不管这个连接是否在活动中,如果使用上面的命令再去连接WiFi会报错:
解决方案:
- 首选:通过连接维度去二次连接WiFi。参照本文 2.4.4 章节。
- 备选:删除当前的连接配置:nmcli con del xxx
示例3:连接隐藏WiFi
在路由器或无线AP里将WiFi隐藏(关闭无线广播)后,默认搜不到隐藏后的WiFi,此时可通过指定BSSID并配合hidden参数来连接隐藏WiFi:
nmcli device wifi connect <BSSID> hidden yes password 'mypassword'
另一种方式是手动添加一个WiFi连接配置,并在连接中指定ssid和密码,并启用连接。
添加一个WiFi连接配置:
nmcli con add type wifi con-name 'hidden-wifi' ifname <无线网卡> ssid <隐藏的WiFi名称>
添加WiFi密码:
nmcli con mod 'hidden-wifi' wifi-sec.key-mgmt wpa-psk wifi-sec.psk 'mypassword'
启用连接:
nmcli con up 'hidden-wifi'
连接成功后,可正常显示已连接到的隐藏WiFi。关于connection add和connection modify的详细介绍可参照本文2.4.6、2.4.7章节。
2.5.12 创建WiFi热点(wifi hotspot)
前提条件必须具备无线网卡。
示例:创建一个WiFi热点
创建一个名为mywifi,密码为mypassword的WiFi热点:
nmcli device wifi hotspot ifname <无线网卡> ssid mywifi password 'mypassword'
启用热点并打印热点密码和二维码:
nmcli con up Hotspot
nmcli dev wifi show-password
如果过程中出现这类报错:Error: Connection activation failed: IP configuration could not be reserved (no available address, timeout, etc.) 则需要安装一下dnsmasq。
2.5.13 重新扫描WiFi(wifi rescan)
默认情况下,NetworkManager会定期扫描Wi-Fi网络,而执行rescan则会立即重新扫描wifi网络。可以扫描特定的ssid,对隐藏WiFi很有用。可以一次性提供多个ssid进行扫描。
格式也很简单:
wifi rescan [ifname ifname] [ssid SSID...]
ifname指定无线网卡,ssid指定WiFi名。
示例1:执行重新扫描
nmcli dev wifi rescan
示例2:指定无线网卡扫描特定SSID的WiFi
nmcli dev wifi rescan ifname <网卡名> SSID <WiFi名>
之后通过wifi list查看WiFi列表即可。
2.5.14 查看WiFi密码(wifi show-password)
准确来说,这里只能查看处在活动连接中的WiFi密码,即当前设备已经连接到了WiFi上。如果要看历史连接过的WiFi的密码,可以查看本文 2.4.3 章节,通过连接维度去看psk密码。
wifi show-password后面只能可选接一个参数:ifname <无线网卡>,如果不接,默认打印所有无线网卡对应的活跃连接中的WiFi密码。
示例:查看特定无线网卡的WiFi密码
nmcli device wifi show-password ifname <网卡名>
可以看到,nmcli默认会将WiFi名(SSID)、加密协议、WiFi密码,以及WiFi二维码全部打印出来,客户端设备可以扫描二维码连接到WiFi。
2.6 一些通用选项
通用选项可以参照下面的表格,有一些上面已经展示过用法。
选项 | 含义 |
---|---|
-a | –ask | 交互式输入密码 |
-c | –colors {yes | no | auto} | 控制颜色输出,默认为auto |
–complete-args | 列出最后一个参数的可能项 |
-e | –escape {yes | no} | 是否在简洁的表格模式下转义:和\字符,默认yes |
-f | –fields {field1,field2…|all|common} | 指定打印的字段名 |
-g | –get-values {field1,field2…|all|common} | 打印特定字段的值 |
-m | –mode {tabular | multiline} | 在表格和多行输出模式之间切换 |
-p | –pretty | 美观输出 |
-s | –show-secrets | 明文显示操作输出中可能存在的密码 |
-t | –terse | 简化输出,转为脚本而设计 |
–offline | 在没有守护进程的情况下工作。使连接添加和连接修改命令通过标准输入/输出接受和生成连接数据 |
-w | –wait seconds | 等待NetworkManager完成操作的超时时间 |
以上选项按需使用,不一一展开细讲,下面举几个常用例子。
2.6.1 交互式输入密码(-a | –ask)
比如需要连接一个WiFi网络或者其它需要密码进行身份授权的网络,并不想在终端上直接展示明文密码,此时可以通过–ask选项交互式的输入密码。
nmcli dev wifi connect <SSID> --ask
2.6.2 美观输出(-p | –pretty)
美观输出可以提升易读性,-p参数要加在前面,连接配置的输出和WiFi列表的输出前后对比:
nmcli -p con sh
nmcli -p dev wifi
2.6.3 简化输出(-t | –terse)
写脚本时常用,不需要那么多输出内容,越简短越好,之后可通过文本过滤或正则匹配等相关命令进行二次处理,拿到想要的值即可。
WiFi输出和连接输出的前后简化输出对比:
nmcli -t dev wifi
nmcli -t connection show
2.6.4 指定超时时间(-w | –wait seconds)
此选项设置nmcli等待NetworkManager完成操作的超时时间,对于可能需要更长时间才能完成的命令特别有用,
例如连接激活。缺省情况下也存在默认超时时间,目前有8个命令涉及到超时默认时间,已经整理到如下表格:
命令 | 默认超时时间 |
---|---|
connection up | 90s |
connection down | 10s |
connection delete | 10s |
connection migrage | 10s |
device up | 90s |
device down | 10s |
device delete | 10s |
device wifi connect | 90s |
通过man文档也能查阅到存在上述默认超时时间的命令个数,刚好8个:
man nmcli|grep 'If --wait option is not specified'
三、总结
非常感谢你能看到这里,本文篇幅之长也恰恰体现nmcli 强大且实用的功能特性。于网络控制层面,既能启用、禁用网络,又可精准获取连接的最新状态。无线传输控制方面,轻松实现WiFi、移动宽带及所有无线开关的便捷操作。连接管理上,涵盖打印、排序连接状态,查看指定连接详情,以及连接的全生命周期管理,如启用、禁用、创建、修改、克隆、删除等操作,同时支持连接配置的重载与加载。设备管理维度,全方位展示和管理网络接口,包括接口的状态和详细细节的输出、属性设置、连接操作、修改应用、设备删除与监控,以及WiFi相关的系列操作如列出、重扫描、连接、创建热点和查看密码等。
综上所述,本文从常规使用、网络控制、无线传输控制、连接管理直至设备管理等多个维度,对 nmcli 的使用进行了全面且深入的总结,并佐以大量案例加以演示。相信读者读完本篇,对 nmcli 的理解将大幅提升,能够熟练运用其基本及高级功能,有效实现高效网络管理。