Files
deploy.stack/shell/proxy-glm5_2.sh
T

270 lines
8.9 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
# ============================================================
# File: proxy.sh
# Description: 通用代理管理脚本
# Usage:
# source proxy.sh # 加载默认配置
# proxy on # 开启代理
# proxy off # 关闭代理
# proxy status # 查看代理状态
# proxy test # 测试代理连通性
# proxy set <host> <port> # 临时设置代理地址
#
# 也可直接执行: bash proxy.sh [on|off|status|test|set ...]
# ============================================================
# -------------------- 默认配置 --------------------
PROXY_HOST="${PROXY_HOST:-127.0.0.1}"
PROXY_PORT="${PROXY_PORT:-7890}"
PROXY_TYPE="${PROXY_TYPE:-http}" # http 或 socks5
NO_PROXY_LIST="localhost,127.0.0.1,::1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16"
# -------------------- 构建代理 URL --------------------
function _build_proxy_url() {
local type="${PROXY_TYPE:-http}"
local host="${PROXY_HOST:-127.0.0.1}"
local port="${PROXY_PORT:-7890}"
case "$type" in
http|HTTP) echo "http://${host}:${port}" ;;
socks5|socks) echo "socks5://${host}:${port}" ;;
socks4) echo "socks4://${host}:${port}" ;;
*) echo "${type}://${host}:${port}" ;;
esac
}
# -------------------- 开启代理 --------------------
function proxy_on() {
local url
url="$(_build_proxy_url)"
# --- 环境变量 ---
export http_proxy="$url"
export HTTP_PROXY="$url"
export https_proxy="$url"
export HTTPS_PROXY="$url"
export all_proxy="$url"
export ALL_PROXY="$url"
export no_proxy="$NO_PROXY_LIST"
export NO_PROXY="$NO_PROXY_LIST"
export ftp_proxy="$url"
export FTP_PROXY="$url"
export rsync_proxy="$url"
# --- Git ---
git config --global http.proxy "$url" 2>/dev/null
git config --global https.proxy "$url" 2>/dev/null
# --- NPM ---
npm config set proxy "$url" 2>/dev/null
npm config set https-proxy "$url" 2>/dev/null
# --- Yarn ---
yarn config set proxy "$url" 2>/dev/null
yarn config set https-proxy "$url" 2>/dev/null
# --- Docker(需要 sudo 权限写入配置目录)---
if [ -d /etc/systemd/system/docker.service.d ]; then
local docker_conf="/etc/systemd/system/docker.service.d/http-proxy.conf"
sudo bash -c "cat > '$docker_conf' <<EOF
[Service]
Environment=\"HTTP_PROXY=$url\"
Environment=\"HTTPS_PROXY=$url\"
Environment=\"NO_PROXY=$NO_PROXY_LIST\"
EOF"
sudo systemctl daemon-reload 2>/dev/null
sudo systemctl restart docker 2>/dev/null
fi
echo -e "\033[32m[✓] 代理已开启 → \033[1m${url}\033[0m"
echo -e "\033[32m NO_PROXY → \033[1m${NO_PROXY_LIST}\033[0m"
}
# -------------------- 关闭代理 --------------------
function proxy_off() {
# --- 环境变量 ---
unset http_proxy HTTP_PROXY
unset https_proxy HTTPS_PROXY
unset all_proxy ALL_PROXY
unset no_proxy NO_PROXY
unset ftp_proxy FTP_PROXY
unset rsync_proxy
# --- Git ---
git config --global --unset http.proxy 2>/dev/null
git config --global --unset https.proxy 2>/dev/null
# --- NPM ---
npm config delete proxy 2>/dev/null
npm config delete https-proxy 2>/dev/null
# --- Yarn ---
yarn config delete proxy 2>/dev/null
yarn config delete https-proxy 2>/dev/null
# --- Docker ---
local docker_conf="/etc/systemd/system/docker.service.d/http-proxy.conf"
if [ -f "$docker_conf" ]; then
sudo rm -f "$docker_conf"
sudo systemctl daemon-reload 2>/dev/null
sudo systemctl restart docker 2>/dev/null
fi
echo -e "\033[31m[✓] 代理已关闭\033[0m"
}
# -------------------- 查看代理状态 --------------------
function proxy_status() {
echo -e "\n\033[1m========== 代理状态 ==========\033[0m"
# 环境变量
echo -e "\n\033[1m[环境变量]\033[0m"
local env_vars=("http_proxy" "https_proxy" "all_proxy" "no_proxy" "ftp_proxy")
for var in "${env_vars[@]}"; do
local val="${!var}"
if [ -n "$val" ]; then
printf " \033[32m%-14s → %s\033[0m\n" "$var" "$val"
else
printf " \033[90m%-14s → (未设置)\033[0m\n" "$var"
fi
done
# Git 配置
echo -e "\n\033[1m[Git 配置]\033[0m"
local git_http git_https
git_http=$(git config --global --get http.proxy 2>/dev/null)
git_https=$(git config --global --get https.proxy 2>/dev/null)
if [ -n "$git_http" ] || [ -n "$git_https" ]; then
[ -n "$git_http" ] && printf " \033[32mhttp.proxy → %s\033[0m\n" "$git_http"
[ -n "$git_https" ] && printf " \033[32mhttps.proxy → %s\033[0m\n" "$git_https"
else
printf " \033[90m(未配置)\033[0m\n"
fi
# NPM 配置
if command -v npm &>/dev/null; then
echo -e "\n\033[1m[NPM 配置]\033[0m"
local npm_proxy npm_https_proxy
npm_proxy=$(npm config get proxy 2>/dev/null)
npm_https_proxy=$(npm config get https-proxy 2>/dev/null)
if [ "$npm_proxy" != "null" ] && [ -n "$npm_proxy" ]; then
printf " \033[32mproxy → %s\033[0m\n" "$npm_proxy"
else
printf " \033[90mproxy → (未设置)\033[0m\n"
fi
if [ "$npm_https_proxy" != "null" ] && [ -n "$npm_https_proxy" ]; then
printf " \033[32mhttps-proxy → %s\033[0m\n" "$npm_https_proxy"
else
printf " \033[90mhttps-proxy → (未设置)\033[0m\n"
fi
fi
echo -e "\n"
}
# -------------------- 测试代理连通性 --------------------
function proxy_test() {
local url
url="$(_build_proxy_url)"
echo -e "\033[1m[测试代理] ${url}\033[0m\n"
# 测试 Google (需要代理)
echo -n " Google (proxy) → "
if curl -s -o /dev/null -w "%{http_code}" --max-time 5 --proxy "$url" https://www.google.com 2>/dev/null | grep -q "200\|301\|302"; then
echo -e "\033[32m✓ OK\033[0m"
else
echo -e "\033[31m✗ FAIL\033[0m"
fi
# 测试 GitHub (需要代理)
echo -n " GitHub (proxy) → "
if curl -s -o /dev/null -w "%{http_code}" --max-time 5 --proxy "$url" https://github.com 2>/dev/null | grep -q "200\|301\|302"; then
echo -e "\033[32m✓ OK\033[0m"
else
echo -e "\033[31m✗ FAIL\033[0m"
fi
# 测试本地直连
echo -n " Local (no proxy) → "
if curl -s -o /dev/null -w "%{http_code}" --max-time 3 --noproxy '*' https://www.baidu.com 2>/dev/null | grep -q "200\|301\|302"; then
echo -e "\033[32m✓ OK\033[0m"
else
echo -e "\033[31m✗ FAIL\033[0m"
fi
echo ""
}
# -------------------- 临时设置代理地址 --------------------
function proxy_set() {
if [ $# -lt 2 ]; then
echo -e "\033[33m用法: proxy set <host> <port> [http|socks5]\033[0m"
echo -e "\033[33m示例: proxy set 192.168.1.100 1080 socks5\033[0m"
return 1
fi
PROXY_HOST="$1"
PROXY_PORT="$2"
if [ -n "$3" ]; then
PROXY_TYPE="$3"
fi
echo -e "\033[32m[✓] 代理地址已设置为 ${PROXY_TYPE}://${PROXY_HOST}:${PROXY_PORT}\033[0m"
echo -e "\033[32m 执行 'proxy on' 启用新的代理地址\033[0m"
}
# -------------------- 总入口函数 --------------------
function proxy() {
case "$1" in
on) proxy_on ;;
off) proxy_off ;;
status) proxy_status ;;
test) proxy_test ;;
set) shift; proxy_set "$@" ;;
toggle)
if [ -n "$http_proxy" ]; then
proxy_off
else
proxy_on
fi
;;
help|*)
echo -e "
\033[1m========== proxy.sh — 通用代理管理 ==========\033[0m
\033[1m用法:\033[0m
source proxy.sh # 加载脚本(必须先 source 才能用 proxy 命令)
proxy on # 开启代理(环境变量 + git + npm + docker
proxy off # 关闭代理(清除所有配置)
proxy status # 查看当前代理状态
proxy test # 测试代理连通性
proxy toggle # 切换代理开/关
proxy set <h> <p> [type] # 设置代理地址
proxy help # 显示帮助
\033[1m默认配置(可通过环境变量覆盖):\033[0m
PROXY_HOST = ${PROXY_HOST}
PROXY_PORT = ${PROXY_PORT}
PROXY_TYPE = ${PROXY_TYPE} (http | socks5 | socks4)
\033[1m自定义示例:\033[0m
PROXY_HOST=10.0.0.5 PROXY_PORT=1080 PROXY_TYPE=socks5 source proxy.sh
proxy set 10.0.0.5 1080 socks5 # 临时修改
"
;;
esac
}
# -------------------- 执行入口 --------------------
# 如果被直接执行(非 source),解析命令行参数
if [ "${BASH_SOURCE[0]:-$0}" = "$0" ]; then
if [ $# -gt 0 ]; then
proxy "$@"
else
proxy help
fi
else
# source 方式加载,显示提示
echo -e "\033[36m[proxy.sh] 已加载。使用 'proxy help' 查看用法。\033[0m"
fi