forked from DevOps/deploy.stack
feat(shell): add universal proxy management scripts
This commit is contained in:
@@ -0,0 +1,269 @@
|
||||
#!/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
|
||||
Reference in New Issue
Block a user