You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 11:35:28