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

问题描述 投票:0回答:3

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

最好的方法是什么?

bash connection gsm networkmanager nmcli
3个回答
1
投票

这实际上是一个比表面上看起来更棘手的问题,因为 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.

0
投票
nmcli con del $(nmcli -t -f UUID,TYPE con | awk -F":" '{if ($2 == "gsm") print $1}')

0
投票

详细阐述和解密@Yaroslav752 的答案:

ethernet_uuids=$(nmcli -t -f UUID,TYPE connection show | awk -F":" '{if ($2 == "gsm") print $1}')
nmcli connection delete $ethernet_uuids

命令

nmcli -t -f UUID,TYPE connection show

是标准连接显示,但带有格式说明符。

-f UUID,TYPE 意思是:只显示字段 UUID 和 TYPE,并按此顺序显示。这避免了边缘情况,例如名称为“这不是 gsm 连接”的以太网连接

-t 更改输出格式以省略标题,并使用冒号而不是空格作为 UUID 和 TYPE 之间的分隔符。

awk 表达式会跳过第二个字段不是单词“gsm”的任何内容。如果第二个字段是 gsm,它会打印第一个字段(即 UUID)。

我的版本将这些uuid 存储在一个变量中,然后将该变量传递给nmcli connection delete 命令。那只是为了可读性;我不太喜欢单线。

© www.soinside.com 2019 - 2024. All rights reserved.