怎样用脚本批量修改VPN配置?

wen 实用脚本 4

本文目录导读:

怎样用脚本批量修改VPN配置?

  1. 核心原则
  2. 场景一:批量修改OpenVPN配置文件(.ovpn)
  3. 场景二:批量修改WireGuard配置文件(.conf)
  4. 场景三:批量修改IPsec/L2TP 客户端配置
  5. 场景四:批量修改系统级netplan/NetworkManager连接
  6. 关键注意事项
  7. 高级技巧:使用环境变量或模板

批量修改VPN配置通常需要根据具体的VPN客户端或配置格式(如OpenVPN、WireGuard、IPsec、PPTP等)来编写脚本,由于VPN配置文件通常是纯文本(如 .ovpn, .conf 文件)或系统配置文件(如 /etc/ipsec.conf),脚本的核心逻辑是文本替换、增删改参数

以下提供几种常见场景的批量修改方法,包含Shell脚本(Linux/macOS)和PowerShell(Windows)示例。

核心原则

  1. 备份原始文件:在修改前,先备份整个配置目录。
  2. 明确修改字段:修改服务器地址、端口、密钥路径、DNS服务器等。
  3. 确定文件范围:是所有 .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.confstrongswan.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

关键注意事项

  1. 正则表达式转义:IP地址中的 需要用 转义,否则会被当作“匹配任意字符”。
  2. 端口与地址连写:如 remote vip.vpn.com 443,替换时需要把地址和端口一起替换,避免只替换了地址保留错误端口。
  3. 特殊字符:路径中的 在 sed 中建议使用 作为分隔符(如 s|old/path|new/path|g)避免混淆。
  4. sudo权限:修改 /etc/ 下的系统配置文件通常需要 sudo
  5. 测试先行:先对一个文件执行替换,检查结果无误后,再循环所有文件。

高级技巧:使用环境变量或模板

如果你需要为每个用户每个服务器生成不同的配置(不仅仅是修改固定值),建议使用模板引擎(如 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)选择对应的字段进行替换即可。

抱歉,评论功能暂时关闭!