如何通过Shell脚本更新swanctl.conf文件并保留原有格式
如何用Shell脚本更新swanctl.conf的字段并保留原有格式与空格?
我是Shell脚本新手,现有一份swanctl.conf配置文件,希望通过Shell脚本(.sh)更新其中remote_addrs、local_addrs等字段的值,请问如何操作才能保留文件原有格式与空格?
配置文件示例:
# Section defining IKE connection configurations. connections { conn1 { local_addrs = x.x.x.x remote_addrs = x.x.x.x local { auth = psk id = local-id } remote { auth = psk id = remote-id } children { conn1-child { local_ts = x.x.x.x remote_ts = x.x.x.x start_action = start esp_proposals = aes128gcm128-x25519 mode = tunnel } } version = 2 mobike = no reauth_time = 10800 proposals = aes128-sha256-x25519 } }
解决方案:用sed精准匹配并替换
要保留原有格式和空格,核心是精准匹配目标字段所在的行(包括缩进空格),只替换等号后的值,不改动前面的格式。以下是针对你的配置文件的具体实现:
1. 编写Shell脚本示例
#!/bin/bash # 定义要替换的新值 NEW_LOCAL_ADDR="192.168.1.100" NEW_REMOTE_ADDR="203.0.113.5" CONFIG_FILE="./swanctl.conf" # 先备份原文件,避免修改出错 cp $CONFIG_FILE ${CONFIG_FILE}.bak # 修改conn1块下的local_addrs字段 sed -i "/^ conn1 {/,/^ }/s/^\( local_addrs = \).*/\1${NEW_LOCAL_ADDR}/" $CONFIG_FILE # 修改conn1块下的remote_addrs字段 sed -i "/^ conn1 {/,/^ }/s/^\( remote_addrs = \).*/\1${NEW_REMOTE_ADDR}/" $CONFIG_FILE echo "配置更新完成,原文件已备份为${CONFIG_FILE}.bak"
2. 关键逻辑说明
- 范围锁定:
/^ conn1 {/,/^ }/表示只在conn1这个连接块内执行替换,避免误改其他连接的同名字段。这里的^是精准匹配行开头的两个空格,对应你的配置里conn1的缩进。 - 格式保留:
s/^\( local_addrs = \).*/\1${NEW_LOCAL_ADDR}/中,^\( local_addrs = \)捕获了行开头的5个空格+local_addrs =(含字段名后的两个空格),替换时保留这部分原有格式,仅更新后面的IP值。 - 安全备份:修改前用
cp备份原文件,防止操作失误导致配置丢失。
3. 扩展修改子连接字段
如果要修改conn1-child下的local_ts或remote_ts,可以缩小匹配范围到子连接块:
# 定义子连接的新值 NEW_LOCAL_TS="192.168.1.0/24" # 修改conn1-child块下的local_ts sed -i "/^ conn1-child {/,/^ }/s/^\( local_ts = \).*/\1${NEW_LOCAL_TS}/" $CONFIG_FILE
这里的/^ conn1-child {/,/^ }/ 精准匹配子连接块的范围,^\( local_ts = \) 对应子字段的缩进空格。
注意事项
- 确保脚本中匹配的缩进空格数和你的配置文件完全一致,比如
local_addrs前是5个空格,脚本里就写(5个空格)。 - 如果配置中有多个同名连接块,要调整范围匹配的条件(比如增加唯一标识),避免误改。
内容的提问来源于stack exchange,提问作者ppb
相关产品推荐
相关产品推荐

