本文目录导读:

我来为您提供一个定时刷新代理设置的脚本,这里有几个不同场景的解决方案:
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
这些脚本会自动定时刷新代理设置,确保代理连接稳定,您可以根据需要修改代理地址、端口和刷新间隔等参数。