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
|