使用某些wifi时如何使用nmcli始终连接到vpn?

spe*_*00b 3 arch-linux networkmanager openvpn nmcli

因此,使用 nm-applet 可以很容易地保存连接的 vpn 连接和用户名+密码,然后在使用某些 Wi-Fi 连接时自动连接到它。所以它总是会自动连接到它而无需询问密码。

如何通过终端使用 nmcli 等实现这一点?尝试编写脚本以更轻松地部署更多连接和编辑它们。

到目前为止,我只设法

nmcli connection import type openvpn file ned.ovpn
Run Code Online (Sandbox Code Playgroud)

我还注意到,一旦保存的连接可以在

 /etc/NetworkManager/system-connections/
Run Code Online (Sandbox Code Playgroud)

我试图将相同的设置从笔记本电脑复制到台式机,但似乎没有任何改变。它似乎没有看到/更改这些设置。

A.B*_*A.B 7

这是我最初评论中的详细解释。目标是学习使用 CLI 工具nmcli的等效项,而无需浏览所有文档以查明设置,只要用户在 GUI 工具上知道该设置:在此 GUI 工具nm-applet的临时帮助下,它必须在具有等效设置的某处(甚至不是同一系统)可用。这只是一种通用方法,可用于此处考虑的设置以外的任何其他设置。

涉及两个连接:我将它们称为main,以及使用main时将自动连接的myVPN。这里的更改将在main上完成,这是必须检查的。

$ nmcli connection show
NAME                UUID                                  TYPE       DEVICE 
main                cfa5be23-925a-4273-b5de-2f9adaac8782  wifi       --
myVPN               0d9e60ef-6b5e-4f65-8312-8db428589866  vpn        --
Run Code Online (Sandbox Code Playgroud)

要显示 main 的配置,请执行以下任一操作:

nmcli connection show id main
nmcli connection show uuid cfa5be23-925a-4273-b5de-2f9adaac8782
Run Code Online (Sandbox Code Playgroud)

将在许多其他行中转储,例如:

connection.id:                          main
connection.uuid:                        cfa5be23-925a-4273-b5de-2f9adaac8782
connection.type:                        802-11-wireless
Run Code Online (Sandbox Code Playgroud)

[...]

所以首先将所有这些转储到一个文件中。一些输出是本地化的,所以最好先做export LANG=C.UTF-8(如果以后应该在互联网上搜索或比较特定的设置名称或值,这会有所帮助):

nmcli c show id main > /tmp/before
Run Code Online (Sandbox Code Playgroud)

使用该功能已知的 GUI 工具nm-applet,将 VPN myVPN添加到 main:

设置 VPN 自动连接

再次倾倒它:

nmcli c show id main > /tmp/after
Run Code Online (Sandbox Code Playgroud)

现在diff可以比较并显示发生了什么变化:

$ diff -u /tmp/before /tmp/after
--- /tmp/before 2019-05-04 10:47:43.410149358 +0200
+++ /tmp/after  2019-05-04 10:47:58.798252044 +0200
@@ -15,7 +15,7 @@
 connection.master:                      --
 connection.slave-type:                  --
 connection.autoconnect-slaves:          -1 (default)
-connection.secondaries:                 --
+connection.secondaries:                 0d9e60ef-6b5e-4f65-8312-8db428589866
 connection.gateway-ping-timeout:        0
 connection.metered:                     unknown
 connection.lldp:                        default
Run Code Online (Sandbox Code Playgroud)

所以这意味着之前不显眼的设置connection.secondaries被设置为myVPN的 UUID: 0d9e60ef-6b5e-4f65-8312-8db428589866nm-settings(5)连接设置中讲述了它:

字符串 [] 的辅助数组

激活基本连接本身时应激活的连接 UUID 列表。目前仅支持 VPN 连接。

您现在可以使用以下命令再次清除主上与VPN 的任何自动连接:

nmcli c modify id main connection.secondaries ''
Run Code Online (Sandbox Code Playgroud)

并再次添加myVPN(它是一个数组,因此+):

nmcli c modify id main +connection.secondaries 0d9e60ef-6b5e-4f65-8312-8db428589866
Run Code Online (Sandbox Code Playgroud)

使用一些胶水代码(从 id 检索 uuid 等),现在可以自动化了。

当然,相应的行会在 中某处的文件中添加或删除/etc/NetworkManager/,但不应依赖于此。

注意:在写这个答案之前我不知道这个设置,我只是按照我说的去做。