#!/usr/bin/env bash # ============================================================ # File: proxy.sh # Description: 通用代理管理脚本 # Usage: # source proxy.sh # 加载默认配置 # proxy on # 开启代理 # proxy off # 关闭代理 # proxy status # 查看代理状态 # proxy test # 测试代理连通性 # proxy set # 临时设置代理地址 # # 也可直接执行: 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' </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 [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

[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