我想要一个 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.
nmcli con del $(nmcli -t -f UUID,TYPE con | awk -F":" '{if ($2 == "gsm") print $1}')