如何使用 nmcli 按类型删除连接?

问题描述

我想要一个 bash 脚本,它可以使用 nmcli 删除我所有的 gsm 类型的网络管理器连接。

最好的方法是什么?

解决方法

这实际上是一个比表面看起来更棘手的问题,因为 NetworkManager 允许连接名称中包含空格。这使得连接名称的 nmcli connection show 输出的编程解析有点尴尬。我认为编写脚本的最佳选择是依赖 UUID,因为它似乎始终是一个 36 个字符的十六进制字符和破折号组。这意味着我们可以使用正则表达式一致地提取它。例如,您可以使用以下内容获取 gsm 连接的 UUID 列表:

$ nmcli connection show | grep gsm | grep -E -o '[0-9a-f\-]{36}'
cc823da6-d4e1-4757-a37a-aaaaaaaaa
etc

因此您可以获取 UUID,然后根据 UUID 进行删除:

GSM_UUIDS=$(nmcli connection show | grep gsm | grep -E -o '[0-9a-f\-]{36}')
while IFS= read -r UUID; do echo nmcli connection delete $UUID; done <<< "$GSM_UUIDS"

使用 echo 运行以确保您获得预期的结果,然后您可以将其删除,您应该可以开展业务了。我使用一些虚拟 GSM 连接在本地运行,它似乎按照您希望的方式工作:

GSM_UUIDS=$(nmcli connection show | grep gsm | grep -E -o '[0-9a-f\-]{36}')
while IFS= read -r UUID; do nmcli connection delete $UUID; done <<< "$GSM_UUIDS" 
Connection 'gsm' (cd311376-d7ab-4891-ba73-e4e8a3fc6614) successfully deleted.
Connection 'gsm-1' (54171181-5c37-4224-baf5-9eb36458f773) successfully deleted.