forked from DevOps/deploy.stack
270 lines
8.9 KiB
Bash
270 lines
8.9 KiB
Bash
#!/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
|