本文目录导读:

- 核心原则
- 场景一:批量修改OpenVPN配置文件(.ovpn)
- 场景二:批量修改WireGuard配置文件(.conf)
- 场景三:批量修改IPsec/L2TP 客户端配置
- 场景四:批量修改系统级netplan/NetworkManager连接
- 关键注意事项
- 高级技巧:使用环境变量或模板
批量修改VPN配置通常需要根据具体的VPN客户端或配置格式(如OpenVPN、WireGuard、IPsec、PPTP等)来编写脚本,由于VPN配置文件通常是纯文本(如 .ovpn, .conf 文件)或系统配置文件(如 /etc/ipsec.conf),脚本的核心逻辑是文本替换、增删改参数。
以下提供几种常见场景的批量修改方法,包含Shell脚本(Linux/macOS)和PowerShell(Windows)示例。
核心原则
- 备份原始文件:在修改前,先备份整个配置目录。
- 明确修改字段:修改服务器地址、端口、密钥路径、DNS服务器等。
- 确定文件范围:是所有
.ovpn文件,还是特定文件夹下的配置。
批量修改OpenVPN配置文件(.ovpn)
假设你有一堆 .ovpn 文件,需要将旧的服务器地址 old.vpn.com 替换为 new.vpn.com。
Linux/macOS (Bash脚本)
#!/bin/bash
# 脚本: modify_openvpn.sh
# 功能: 批量替换所有 .ovpn 文件中的服务器地址和端口
TARGET_DIR="/path/to/your/vpn/configs" # 替换为你的配置目录
BACKUP_DIR="${TARGET_DIR}/backup_$(date +%Y%m%d_%H%M%S)"
# 1. 创建备份
mkdir -p "$BACKUP_DIR"
cp "$TARGET_DIR"/*.ovpn "$BACKUP_DIR"/
echo "已备份到 $BACKUP_DIR"
# 2. 遍历并修改
for file in "$TARGET_DIR"/*.ovpn; do
if [ -f "$file" ]; then
echo "处理文件: $(basename "$file")"
# 使用 sed 命令进行替换
# -i '' 表示原地修改(macOS需要加 '' 参数,Linux可以直接 -i)
# s/old/new/g 表示全局替换
# 示例1: 替换服务器地址
sed -i '' 's/old\.vpn\.com/new.vpn.com/g' "$file"
# 示例2: 替换端口 1194 改为 443
sed -i '' 's/remote old\.vpn\.com 1194/remote new.vpn.com 443/g' "$file"
# 示例3: 修改认证文件路径(如果存在)
sed -i '' 's|/old/path/to/cert|/new/path/to/cert|g' "$file"
fi
done
echo "修改完成!"
Windows (PowerShell脚本)
# 脚本: modify_openvpn.ps1
# 功能: 批量替换 .ovpn 文件内容
$targetDir = "C:\Users\YourName\VPNConfigs" # 修改为你的目录
$backupDir = "$targetDir\backup_$(Get-Date -Format 'yyyyMMdd_HHmmss')"
# 1. 备份
New-Item -ItemType Directory -Path $backupDir -Force | Out-Null
Copy-Item "$targetDir\*.ovpn" -Destination $backupDir
Write-Host "已备份到 $backupDir"
# 2. 获取所有 .ovpn 文件
$files = Get-ChildItem -Path $targetDir -Filter "*.ovpn"
foreach ($file in $files) {
Write-Host "处理文件: $($file.Name)"
# 读取文件内容
$content = Get-Content $file.FullName -Raw
# 替换操作 (支持正则表达式)
$content = $content -replace 'old\.vpn\.com', 'new.vpn.com'
$content = $content -replace 'remote old\.vpn\.com 1194', 'remote new.vpn.com 443'
# 写回文件
Set-Content $file.FullName -Value $content -NoNewline
}
Write-Host "修改完成!"
批量修改WireGuard配置文件(.conf)
WireGuard配置通常包含 [Peer] 和 [Interface] 部分,假设你需要批量修改所有 Peer 的 Endpoint 地址。
Linux Shell 示例
#!/bin/bash
# 批量修改 WireGuard 配置中的 Endpoint 地址
CONFIG_DIR="/etc/wireguard" # 通常在此目录,需要root权限
# 或者 /path/to/your/wireguard/configs
for file in "$CONFIG_DIR"/*.conf; do
[ -e "$file" ] || continue # 防止无文件时报错
echo "修改: $(basename "$file")"
# 替换 Endpoint 地址(注意端口可能不同)
# 模式: Endpoint = old.server.com:51820
sudo sed -i 's|Endpoint = old\.server\.com:51820|Endpoint = new.server.com:51820|g' "$file"
# 也可以修改 DNS
sudo sed -i 's|DNS = 8.8.8.8|DNS = 1.1.1.1|g' "$file"
done
echo "WireGuard 配置批量修改完成"
批量修改IPsec/L2TP 客户端配置
IPsec经常使用 ipsec.conf 或 strongswan.conf 文件,如果这些配置文件名不统一,你可以搜索所有包含特定模式的文件。
示例:修改所有包含某旧 IP 的配置
#!/bin/bash
# 批量替换所有 .conf 文件中的 IP 地址
OLD_IP="192.168.1.1"
NEW_IP="10.0.0.1"
BACKUP_DIR="./backup_$(date +%Y%m%d)"
# 找到所有可能包含VPN配置的文本文件(谨慎指定目录)
find /etc -type f \( -name "*.conf" -o -name "*.ovpn" -o -name "config" \) \
-exec sh -c 'mkdir -p "$BACKUP_DIR" && cp "$1" "$BACKUP_DIR"' _ {} \; 2>/dev/null
echo "备份完成,开始替换..."
# 使用 grep 确认哪些文件包含旧IP,再替换
grep -rl "$OLD_IP" /etc --include="*.conf" --include="*.ovpn" 2>/dev/null | while read -r file; do
echo "修改: $file"
# -i 参数谨慎使用,建议先测试
sed -i "s/$OLD_IP/$NEW_IP/g" "$file"
done
批量修改系统级netplan/NetworkManager连接
如果你使用 nmcli (NetworkManager命令行),这是最推荐的方式,因为它不直接修改文件,而是通过标准工具。
#!/bin/bash
# 批量修改 NetworkManager 中的VPN连接
# 假设你有很多名为 "VPN-Office-*" 的连接
# 列出所有VPN连接
nmcli connection show | grep vpn
# 批量修改网关(将所有的 old-address 替换为新地址)
# 需要先获取每个连接的vpn.data属性,然后修改,比较复杂
# 更简单的做法:删除旧的,用脚本批量创建新的。
# 示例:批量启用/禁用某个VPN
for conn in $(nmcli -t -f NAME connection show | grep VPN); do
echo "重连: $conn"
nmcli connection down "$conn"
nmcli connection up "$conn"
done
关键注意事项
- 正则表达式转义:IP地址中的 需要用 转义,否则会被当作“匹配任意字符”。
- 端口与地址连写:如
remote vip.vpn.com 443,替换时需要把地址和端口一起替换,避免只替换了地址保留错误端口。 - 特殊字符:路径中的 在
sed中建议使用 作为分隔符(如s|old/path|new/path|g)避免混淆。 - sudo权限:修改
/etc/下的系统配置文件通常需要sudo。 - 测试先行:先对一个文件执行替换,检查结果无误后,再循环所有文件。
高级技巧:使用环境变量或模板
如果你需要为每个用户或每个服务器生成不同的配置(不仅仅是修改固定值),建议使用模板引擎(如 Bash heredoc + envsubst):
#!/bin/bash
# 批量生成个性化配置
USER_LIST=("alice" "bob" "carol")
SERVER_ADDR="vpn.company.com"
for user in "${USER_LIST[@]}"; do
cat > "${user}.ovpn" << EOF
client
dev tun
proto udp
remote ${SERVER_ADDR} 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert ${user}.crt
key ${user}.key
EOF
echo "已为 $user 生成配置文件"
done
确定文件格式 -> 备份 -> 使用sed或PowerShell的-replace操作符 -> 验证结果,根据你的VPN类型(OpenVPN/WireGuard/IPsec)选择对应的字段进行替换即可。