定时刷新代理设置的脚本

wen 实用脚本 3

本文目录导读:

定时刷新代理设置的脚本

  1. 方案一:Linux/macOS 系统的简单Shell脚本
  2. 方案二:带配置文件的高级版本
  3. 方案三:Windows PowerShell 脚本
  4. 使用方法
  5. 设置为系统服务(Linux)

我来为您提供一个定时刷新代理设置的脚本,这里有几个不同场景的解决方案:

Linux/macOS 系统的简单Shell脚本

#!/bin/bash
# 代理设置
PROXY_HOST="127.0.0.1"
PROXY_PORT="7890"
# 不需要代理的地址
NO_PROXY="localhost,127.0.0.1,::1"
# 刷新间隔(秒)
INTERVAL=300  # 5分钟
# 日志文件
LOG_FILE="/var/log/proxy_refresh.log"
# 设置代理函数
set_proxy() {
    export http_proxy="http://$PROXY_HOST:$PROXY_PORT"
    export https_proxy="http://$PROXY_HOST:$PROXY_PORT"
    export HTTP_PROXY="http://$PROXY_HOST:$PROXY_PORT"
    export HTTPS_PROXY="http://$PROXY_HOST:$PROXY_PORT"
    export no_proxy="$NO_PROXY"
    export NO_PROXY="$NO_PROXY"
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] 代理设置已刷新" >> "$LOG_FILE"
    echo "代理设置已成功更新"
}
# 清除代理函数
clear_proxy() {
    unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY no_proxy NO_PROXY
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] 代理已清除" >> "$LOG_FILE"
    echo "代理设置已清除"
}
# 检查代理是否可用
check_proxy() {
    timeout 3 curl -s -o /dev/null -w "%{http_code}" \
        --proxy "http://$PROXY_HOST:$PROXY_PORT" \
        http://www.google.com 2>/dev/null || echo "000"
}
# 主循环
echo "代理刷新脚本启动..."
echo "刷新间隔: $INTERVAL 秒"
echo "代理地址: $PROXY_HOST:$PROXY_PORT"
echo "----------------------------------------"
while true; do
    # 检查代理是否可用
    HTTP_CODE=$(check_proxy)
    if [ "$HTTP_CODE" = "000" ] || [ "$HTTP_CODE" = "" ]; then
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] 代理不可用,跳过设置"
    else
        set_proxy
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] 代理检查通过 (HTTP $HTTP_CODE)"
    fi
    echo "等待 $INTERVAL 秒后再次更新..."
    sleep $INTERVAL
done

带配置文件的高级版本

#!/bin/bash
# 配置文件
CONFIG_FILE="$HOME/.proxy_config"
# 默认配置
if [ ! -f "$CONFIG_FILE" ]; then
    cat > "$CONFIG_FILE" << EOF
# 代理配置
PROXY_HOST=127.0.0.1
PROXY_PORT=7890
# SOCKS5代理(可选)
SOCKS5_PROXY=127.0.0.1:1080
# 排除地址
NO_PROXY=localhost,127.0.0.1,::1,.local
# 刷新间隔(秒)
INTERVAL=300
# 日志级别 (INFO, WARN, ERROR)
LOG_LEVEL=INFO
EOF
    echo "已创建配置文件: $CONFIG_FILE"
fi
# 加载配置
source "$CONFIG_FILE"
# 日志文件
LOG_DIR="/var/log/proxy_refresh"
LOG_FILE="$LOG_DIR/proxy_refresh.log"
STATUS_FILE="/tmp/proxy_status"
# 创建日志目录
mkdir -p "$LOG_DIR"
# 日志函数
log() {
    local level=$1
    local message=$2
    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    # 根据日志级别过滤
    case $LOG_LEVEL in
        "ERROR") [ "$level" = "ERROR" ] && echo "[$timestamp] [$level] $message" >> "$LOG_FILE" ;;
        "WARN")  [[ "$level" =~ ^(ERROR|WARN)$ ]] && echo "[$timestamp] [$level] $message" >> "$LOG_FILE" ;;
        "INFO")  echo "[$timestamp] [$level] $message" >> "$LOG_FILE" ;;
    esac
    echo "[$timestamp] [$level] $message"
}
# 设置系统级代理 (Ubuntu/Debian)
set_system_proxy() {
    # GNOME
    if command -v gsettings &> /dev/null; then
        gsettings set org.gnome.system.proxy mode 'manual'
        gsettings set org.gnome.system.proxy.http host "$PROXY_HOST"
        gsettings set org.gnome.system.proxy.http port "$PROXY_PORT"
        gsettings set org.gnome.system.proxy.https host "$PROXY_HOST"
        gsettings set org.gnome.system.proxy.https port "$PROXY_PORT"
        log "INFO" "GNOME系统代理已设置"
    fi
    # KDE Plasma
    if command -v kwriteconfig5 &> /dev/null; then
        kwriteconfig5 --file kioslaverc --group "Proxy Settings" --key "ProxyType" 1
        kwriteconfig5 --file kioslaverc --group "Proxy Settings" --key "httpProxy" "http://$PROXY_HOST:$PROXY_PORT"
        kwriteconfig5 --file kioslaverc --group "Proxy Settings" --key "httpsProxy" "http://$PROXY_HOST:$PROXY_PORT"
        log "INFO" "KDE系统代理已设置"
    fi
    # 保存当前状态
    echo "active" > "$STATUS_FILE"
}
# 设置环境变量代理
set_env_proxy() {
    export http_proxy="http://$PROXY_HOST:$PROXY_PORT"
    export https_proxy="http://$PROXY_HOST:$PROXY_PORT"
    export HTTP_PROXY="http://$PROXY_HOST:$PROXY_PORT"
    export HTTPS_PROXY="http://$PROXY_HOST:$PROXY_PORT"
    export no_proxy="$NO_PROXY"
    export NO_PROXY="$NO_PROXY"
    # 如果配置了SOCKS5代理
    if [ -n "$SOCKS5_PROXY" ]; then
        export ALL_PROXY="socks5://$SOCKS5_PROXY"
        export all_proxy="socks5://$SOCKS5_PROXY"
    fi
    log "INFO" "环境变量代理已更新"
}
# 测试代理连接
test_proxy() {
    local test_urls=("https://www.google.com" "https://www.baidu.com" "https://github.com")
    for url in "${test_urls[@]}"; do
        local result=$(timeout 5 curl -s -o /dev/null -w "%{http_code}" \
            --proxy "http://$PROXY_HOST:$PROXY_PORT" \
            "$url" 2>/dev/null)
        if [ "$result" = "200" ] || [ "$result" = "301" ] || [ "$result" = "302" ]; then
            log "INFO" "代理测试成功: $url (HTTP $result)"
            return 0
        fi
    done
    log "WARN" "所有代理测试失败"
    return 1
}
# 设置IPTABLES透明代理(可选)
setup_transparent_proxy() {
    # 注意:需要root权限
    if [ "$EUID" -ne 0 ]; then
        return
    fi
    # 重定向所有HTTP流量到代理端口
    iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-port $PROXY_PORT 2>/dev/null
    iptables -t nat -A OUTPUT -p tcp --dport 443 -j REDIRECT --to-port $PROXY_PORT 2>/dev/null
    log "INFO" "透明代理规则已添加"
}
# 主函数
main() {
    log "INFO" "========== 代理刷新服务启动 =========="
    log "INFO" "代理地址: $PROXY_HOST:$PROXY_PORT"
    log "INFO" "刷新间隔: $INTERVAL 秒"
    # 初始设置
    set_env_proxy
    set_system_proxy
    # 初始代理测试
    if test_proxy; then
        log "INFO" "初始代理设置成功"
    else
        log "WARN" "初始代理测试失败,将重试"
    fi
    # 主循环
    while true; do
        sleep $INTERVAL
        # 定时刷新
        log "INFO" "正在刷新代理设置..."
        set_env_proxy
        set_system_proxy
        if test_proxy; then
            log "INFO" "代理刷新成功"
        else
            log "WARN" "代理刷新后测试失败"
        fi
        # 检查代理状态文件(可由其他进程修改)
        if [ -f "$STATUS_FILE" ] && [ "$(cat "$STATUS_FILE")" = "disable" ]; then
            log "INFO" "检测到禁用信号,停止代理刷新"
            exit 0
        fi
    done
}
# 捕获退出信号
trap 'log "INFO" "代理刷新服务停止"; exit 0' SIGINT SIGTERM
# 启动主函数
main

Windows PowerShell 脚本

# proxy_refresh.ps1
param(
    [string]$ProxyHost = "127.0.0.1",
    [int]$ProxyPort = 7890,
    [int]$Interval = 300
)
# 日志配置
$LogPath = "$env:USERPROFILE\AppData\Local\proxy_refresh.log"
$BypassList = @("localhost", "127.0.0.1", "::1")
function Write-Log {
    param([string]$Message)
    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    $logMessage = "[$timestamp] $Message"
    Write-Host $logMessage
    Add-Content -Path $LogPath -Value $logMessage
}
function Set-WindowsProxy {
    param(
        [string]$ProxyAddress,
        [int]$ProxyPort
    )
    try {
        # 设置IE/系统代理
        $regPath = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
        Set-ItemProperty -Path $regPath -Name "ProxyEnable" -Value 1
        Set-ItemProperty -Path $regPath -Name "ProxyServer" -Value "${ProxyAddress}:${ProxyPort}"
        Set-ItemProperty -Path $regPath -Name "ProxyOverride" -Value ($BypassList -join ";")
        # 刷新系统代理设置
        $proxySetting = @"
[InternetSettings]
ProxyEnable=1
ProxyServer=${ProxyAddress}:${ProxyPort}
ProxyOverride=$($BypassList -join ";")
"@
        # 通过WinHTTP API设置代理
        $winhttp = New-Object -ComObject WinHttp.WinHttpRequest.5.1
        $winhttp.SetProxy(1, "${ProxyAddress}:${ProxyPort}", $BypassList -join ";")
        Write-Log "Windows系统代理已设置为 ${ProxyAddress}:${ProxyPort}"
        return $true
    }
    catch {
        Write-Log "设置Windows代理失败: $_"
        return $false
    }
}
function Get-EnvironmentProxyVariables {
    # 设置环境变量
    $env:http_proxy = "http://${ProxyHost}:${ProxyPort}"
    $env:https_proxy = "http://${ProxyHost}:${ProxyPort}"
    $env:HTTP_PROXY = "http://${ProxyHost}:${ProxyPort}"
    $env:HTTPS_PROXY = "http://${ProxyHost}:${ProxyPort}"
    $env:no_proxy = $BypassList -join ","
    $env:NO_PROXY = $BypassList -join ","
    Write-Log "环境变量代理已更新"
}
function Test-ProxyConnection {
    try {
        $webClient = New-Object System.Net.WebClient
        $webClient.Proxy = New-Object System.Net.WebProxy("http://${ProxyHost}:${ProxyPort}")
        $result = $webClient.DownloadString("https://www.google.com")
        Write-Log "代理连接测试成功"
        return $true
    }
    catch {
        Write-Log "代理连接测试失败: $_"
        return $false
    }
}
# 主循环
Write-Log "========== 代理刷新服务启动 =========="
Write-Log "代理地址: ${ProxyHost}:${ProxyPort}"
Write-Log "刷新间隔: ${Interval}秒"
Write-Log "===================================="
# 初始设置
Set-WindowsProxy -ProxyAddress $ProxyHost -ProxyPort $ProxyPort
Get-EnvironmentProxyVariables
# 测试初始连接
if (-not (Test-ProxyConnection)) {
    Write-Log "初始连接测试失败"
}
# 循环刷新
while ($true) {
    Start-Sleep -Seconds $Interval
    Write-Log "正在刷新代理设置..."
    # 重新设置代理
    Set-WindowsProxy -ProxyAddress $ProxyHost -ProxyPort $ProxyPort
    Get-EnvironmentProxyVariables
    # 测试连接
    Test-ProxyConnection | Out-Null
    # 显示当前系统代理设置
    $regPath = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
    $currentProxy = Get-ItemProperty -Path $regPath -Name "ProxyServer" -ErrorAction SilentlyContinue
    Write-Log "当前系统代理: $($currentProxy.ProxyServer)"
}

使用方法

Linux/macOS:

chmod +x proxy_refresh.sh
./proxy_refresh.sh

Windows:

# 运行PowerShell脚本
.\proxy_refresh.ps1
# 或者带参数运行
.\proxy_refresh.ps1 -ProxyHost "192.168.1.100" -ProxyPort 1080 -Interval 600

设置为系统服务(Linux)

创建 systemd 服务文件 /etc/systemd/system/proxy-refresh.service:

[Unit]
Description=Proxy Refresh Service
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/proxy_refresh.sh
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target

然后启用服务:

sudo systemctl daemon-reload
sudo systemctl enable proxy-refresh
sudo systemctl start proxy-refresh

这些脚本会自动定时刷新代理设置,确保代理连接稳定,您可以根据需要修改代理地址、端口和刷新间隔等参数。

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