proxy —— Ubuntu 全局代理管理工具

22 阅读9分钟

🛰️ proxy —— Ubuntu 全局代理管理工具

一个 Shell 脚本,解决 Ubuntu 代理设置散乱、切换繁琐的痛点。安装后注册为全局命令,统一管理代理的开启、关闭、配置与状态检测。


背景:为什么需要这个工具?

在 Ubuntu 上使用代理一直是一件「能用但麻烦」的事。你可能遇到过这些场景:

  • 每次开机都要手动 export http_proxy=...,关掉终端就失效了
  • apt update 走不了代理,还要单独配置 /etc/apt/apt.conf.d/
  • git clone 慢如蜗牛,却忘了 git 有自己独立的代理设置
  • 想临时测试代理是否连通,只能 curl --proxy 手打一长串
  • 同事问你「代理开了没」,你自己都不确定当前状态

于是我写了 proxy——一个单文件 Shell 脚本,安装后注册为全局命令,proxy on -global 一条命令同时搞定 Shell、apt、git 三处代理。


功能速览

命令说明
proxy config 10.x.x.x:7890配置代理地址(支持交互式向导)
proxy on开启代理(默认 -current,仅当前窗口)
proxy on -current仅导出到当前 shell,关闭终端后失效
proxy on -global全局代理:Shell RC + apt + git 一键配置
proxy off关闭并移除所有层级代理
proxy ping测试代理连通性(默认 google.com)
proxy ping <url>测试指定地址连通性
proxy status查看四层代理状态(窗口 / RC / apt / git)
proxy -h帮助信息

安装

前置依赖

  • bash:Ubuntu 默认已安装
  • curl:用于 proxy ping 连通性测试(sudo apt install curl
  • git:可选,proxy on -global 时自动配置 git 代理
  • sudo 权限proxy on -global 写入 apt 配置时需要

一键安装

proxyinstall_proxy.sh 两个文件放在同一目录,执行:

chmod +x proxy install_proxy.sh
sudo bash install_proxy.sh

安装脚本会自动:

  1. 检查 curl / bash 依赖是否存在
  2. proxy 复制到 /usr/local/bin/,注册为全局命令
  3. 引导你完成首次代理地址配置(可回车跳过)

提示:安装完成后无需重新登录,proxy 命令立即可用。


使用指南

第一步:配置代理地址

支持三种配置方式:

# 一次性设置 host 和 port(推荐)
proxy config 10.60.60.39:7890

# 单独修改 host 或 port
proxy config -host 10.60.60.39
proxy config -port 7890

# 交互式向导(忘记格式时使用)
proxy config

配置文件存储在 ~/.config/proxy-manager/config,权限自动设为 600,仅当前用户可读。


第二步:开启代理

proxy on 提供两种模式,按需选择:

-current(默认)—— 仅当前窗口有效
proxy on           # 等同于 proxy on -current
proxy on -current

仅将代理导出到当前 shell 进程,关闭终端后自动失效,不写入任何文件。适合临时使用,不污染系统配置。

-global —— 全局持久代理
proxy on -global

一条命令同时配置四个层级:

层级操作生效范围
Shell 环境变量export http_proxy当前窗口立即生效
~/.bashrc / ~/.zshrc写入代理块新终端自动加载
apt 代理写入 /etc/apt/apt.conf.d/95proxyapt install/update 走代理
git 全局代理git config --global http.proxy所有 git 操作走代理

示例输出:

✔  代理已开启 [全局]: http://10.60.60.39:7890

  ✔  Shell 环境变量   → 当前窗口立即生效
  ✔  ~/.bashrc        → 新终端自动加载
  ✔  apt 代理         → /etc/apt/apt.conf.d/95proxy
  ✔  git 全局代理     → http.proxy / https.proxy

⚠️ 注意:写入 apt 配置需要 sudo 权限,执行时会提示输入密码。


关闭代理

proxy off

proxy off同步移除所有层级的代理配置,无需手动逐一清理:

  • 清除当前 shell 环境变量(unset
  • ~/.bashrc / ~/.zshrc 中移除代理块
  • 删除 /etc/apt/apt.conf.d/95proxy
  • 清除 git 全局代理(git config --global --unset

💡 幂等性proxy off 可以反复执行,不会因为某层配置不存在而报错。


测试连通性

proxy ping                          # 默认测试 https://www.google.com
proxy ping https://www.youtube.com  # 指定测试地址

示例输出:

ℹ  使用代理 http://10.60.60.39:7890 测试连接: https://www.google.com

✔  连通性: 正常  HTTP 200  耗时 342ms

显示 HTTP 状态码和耗时,帮助你快速判断代理质量,而不只是「通了」或「没通」。


查看状态

proxy status

示例输出:

═══ 代理状态检测 ═══

  配置地址   ✔  10.60.60.39:7890  (~/.config/proxy-manager/config)
  当前窗口   ✔  http://10.60.60.39:7890
  Shell RC   ✔  代理已写入 ~/.bashrc(新终端自动生效)
  apt 代理   ✔  /etc/apt/apt.conf.d/95proxy
  git 代理   ✔  http://10.60.60.39:7890

四层状态一览,精准定位「到底哪里没设置」。


设计说明

-current vs -global 的区别

两种模式对应不同的使用场景:

  • -current:零副作用,适合临时调试、一次性任务。关闭终端就干净了,不影响系统其他部分。
  • -global:一次配好,处处生效。适合长期使用代理的开发环境,apt installgit clone 全部自动走代理。

为什么 apt 和 git 需要单独配置?

Linux 下没有统一的系统代理接口,不同工具有各自的代理读取机制:

  • apt 不读取 http_proxy 环境变量,只认 /etc/apt/apt.conf.d/ 下的配置文件
  • git 有独立的代理设置(git config http.proxy),不受 shell 环境变量影响
  • curl / wget 等命令行工具读取 http_proxy 环境变量

proxy on -global 针对这三种机制分别写入,一条命令全部搞定。

配置文件安全性

配置文件路径为 ~/.config/proxy-manager/config,创建时自动设置权限为 600(仅当前用户可读写)。文件格式为简单的 key=value,通过 source 加载,不会执行任意代码。


完整流程示例

# 1. 首次配置代理地址
proxy config 10.60.60.39:7890
# ✔  代理已配置: 10.60.60.39:7890

# 2. 临时开启(当前窗口调试用)
proxy on
# ✔  代理已开启 [当前窗口]: http://10.60.60.39:7890

# 3. 测试连通性
proxy ping
# ✔  连通性: 正常  HTTP 200  耗时 312ms

# 4. 确认没问题后,切换为全局模式
proxy on -global
# ✔  代理已开启 [全局]: http://10.60.60.39:7890
# ✔  Shell 环境变量 / ~/.bashrc / apt / git 全部配置完毕

# 5. 验证状态
proxy status
# 四层全部显示 ✔

# 6. 修改代理服务器地址
proxy config -host 10.60.60.100
proxy on -global  # 重新写入所有层级

# 7. 一键关闭所有代理
proxy off
# ✔  所有代理已关闭(Shell / RC / apt / git 全部清除)

获取脚本

完整源码包含两个文件:

  • proxy — 主脚本,安装后作为全局命令使用
  • install_proxy.sh — 安装脚本,需要 sudo 运行

proxy

#!/usr/bin/env bash
# =============================================================================
# proxy - Ubuntu 全局代理管理工具
# 安装: sudo bash install_proxy.sh
# 用法: proxy <command> [options]
# =============================================================================

set -euo pipefail

# ── 常量 ─────────────────────────────────────────────────────────────────────
CONFIG_FILE="$HOME/.config/proxy-manager/config"
RC_MARKER_BEGIN="# >>> proxy-manager global <<<"
RC_MARKER_END="# <<< proxy-manager global <<<"
BASHRC_FILE="$HOME/.bashrc"
ZSHRC_FILE="$HOME/.zshrc"
APT_PROXY_FILE="/etc/apt/apt.conf.d/95proxy"

# 颜色
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
BOLD='\033[1m'
DIM='\033[2m'
NC='\033[0m'

# ── 工具函数 ──────────────────────────────────────────────────────────────────
info()    { echo -e "${BLUE}${NC}  $*"; }
success() { echo -e "${GREEN}${NC}  $*"; }
warn()    { echo -e "${YELLOW}${NC}  $*"; }
error()   { echo -e "${RED}${NC}  $*" >&2; }
die()     { error "$*"; exit 1; }
bold()    { echo -e "${BOLD}$*${NC}"; }

# ── 配置读写 ──────────────────────────────────────────────────────────────────
load_config() {
    [[ -f "$CONFIG_FILE" ]] || return 1
    # shellcheck source=/dev/null
    source "$CONFIG_FILE"
    return 0
}

save_config() {
    local host="$1" port="$2"
    mkdir -p "$(dirname "$CONFIG_FILE")"
    cat > "$CONFIG_FILE" <<EOF
# proxy-manager 配置文件 — 请勿手动修改格式
PROXY_HOST="${host}"
PROXY_PORT="${port}"
EOF
    chmod 600 "$CONFIG_FILE"
}

get_proxy_url() {
    load_config || die "尚未配置代理,请先运行: proxy config <host>:<port>"
    echo "http://${PROXY_HOST}:${PROXY_PORT}"
}

# ── 格式校验 ──────────────────────────────────────────────────────────────────
validate_host() {
    local host="$1"
    [[ "$host" =~ ^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}$ ]] \
    || [[ "$host" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]] \
    || [[ "$host" == "localhost" ]]
}

validate_port() {
    local port="$1"
    [[ "$port" =~ ^[0-9]+$ ]] && (( port >= 1 && port <= 65535 ))
}

# ── 环境变量工具 ───────────────────────────────────────────────────────────────
_env_export_block() {
    local url="$1"
    cat <<EOF
export http_proxy="${url}"
export https_proxy="${url}"
export HTTP_PROXY="${url}"
export HTTPS_PROXY="${url}"
export ftp_proxy="${url}"
export FTP_PROXY="${url}"
export no_proxy="localhost,127.0.0.1,::1"
export NO_PROXY="localhost,127.0.0.1,::1"
EOF
}

_env_unset_block() {
    cat <<EOF
unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY \
      ftp_proxy FTP_PROXY no_proxy NO_PROXY
EOF
}

# ── -current:仅当前 shell ────────────────────────────────────────────────────
_apply_current() {
    local url="$1"
    eval "$(_env_export_block "$url")"
}

_remove_current() {
    eval "$(_env_unset_block)"
}

# ── -global:写入 rc 文件 ─────────────────────────────────────────────────────
_write_rc() {
    local url="$1" file="$2"
    [[ -f "$file" ]] || return 0
    sed -i "/# >>> proxy-manager global <<</,/# <<< proxy-manager global <<</d" "$file"
    cat >> "$file" <<EOF

${RC_MARKER_BEGIN}
$(_env_export_block "$url")
${RC_MARKER_END}
EOF
}

_remove_rc() {
    local file="$1"
    [[ -f "$file" ]] || return 0
    sed -i "/# >>> proxy-manager global <<</,/# <<< proxy-manager global <<</d" "$file"
}

_rc_has_proxy() {
    grep -q "proxy-manager global" "$BASHRC_FILE" 2>/dev/null
}

# ── -global:apt 代理 ─────────────────────────────────────────────────────────
_write_apt() {
    local host="$1" port="$2"
    sudo tee "$APT_PROXY_FILE" > /dev/null <<EOF
# proxy-manager — apt 代理设置
Acquire::http::Proxy "http://${host}:${port}";
Acquire::https::Proxy "http://${host}:${port}";
EOF
    sudo chmod 644 "$APT_PROXY_FILE"
}

_remove_apt() {
    [[ -f "$APT_PROXY_FILE" ]] && sudo rm -f "$APT_PROXY_FILE"
}

_apt_has_proxy() {
    [[ -f "$APT_PROXY_FILE" ]]
}

# ── -global:git 代理 ─────────────────────────────────────────────────────────
_write_git() {
    local url="$1"
    git config --global http.proxy  "$url"
    git config --global https.proxy "$url"
}

_remove_git() {
    git config --global --unset http.proxy  2>/dev/null || true
    git config --global --unset https.proxy 2>/dev/null || true
}

_git_has_proxy() {
    git config --global --get http.proxy &>/dev/null
}

# ── 子命令:on ────────────────────────────────────────────────────────────────
cmd_on() {
    local mode="${1:--current}"
    local proxy_url
    proxy_url="$(get_proxy_url)"

    case "$mode" in
        -current|current)
            _apply_current "$proxy_url"
            success "代理已开启 ${CYAN}[当前窗口]${NC}: ${CYAN}${proxy_url}${NC}"
            info "仅在本终端窗口有效,关闭后自动失效"
            ;;

        -global|global)
            load_config || die "尚未配置代理"

            # 1. 当前 shell 立即生效
            _apply_current "$proxy_url"

            # 2. rc 文件(新终端自动加载)
            _write_rc "$proxy_url" "$BASHRC_FILE"
            [[ -f "$ZSHRC_FILE" ]] && _write_rc "$proxy_url" "$ZSHRC_FILE"

            # 3. apt 代理(需要 sudo)
            if sudo -n true 2>/dev/null; then
                _write_apt "$PROXY_HOST" "$PROXY_PORT"
            else
                warn "配置 apt 代理需要 sudo 权限,请输入密码:"
                _write_apt "$PROXY_HOST" "$PROXY_PORT"
            fi

            # 4. git 全局代理
            if command -v git &>/dev/null; then
                _write_git "$proxy_url"
            else
                warn "未检测到 git,跳过 git 代理配置"
            fi

            echo ""
            success "代理已开启 ${CYAN}[全局]${NC}: ${CYAN}${proxy_url}${NC}"
            echo ""
            echo -e "  ${GREEN}${NC}  Shell 环境变量   → 当前窗口立即生效"
            echo -e "  ${GREEN}${NC}  ~/.bashrc        → 新终端自动加载"
            [[ -f "$ZSHRC_FILE" ]] && \
            echo -e "  ${GREEN}${NC}  ~/.zshrc         → 新终端自动加载"
            echo -e "  ${GREEN}${NC}  apt 代理         → ${APT_PROXY_FILE}"
            command -v git &>/dev/null && \
            echo -e "  ${GREEN}${NC}  git 全局代理     → http.proxy / https.proxy"
            echo ""
            ;;

        *)
            die "未知选项: $mode  (可用: -current / -global)"
            ;;
    esac
}

# ── 子命令:off ───────────────────────────────────────────────────────────────
cmd_off() {
    echo ""

    # 1. 当前 shell 环境变量
    _remove_current

    # 2. rc 文件
    _remove_rc "$BASHRC_FILE"
    [[ -f "$ZSHRC_FILE" ]] && _remove_rc "$ZSHRC_FILE"

    # 3. apt 代理
    _remove_apt

    # 4. git 代理
    if command -v git &>/dev/null; then
        _remove_git
    fi

    success "所有代理已关闭"
    echo ""
    echo -e "  ${GREEN}${NC}  Shell 环境变量   已清除(当前窗口)"
    echo -e "  ${GREEN}${NC}  ~/.bashrc        已清除代理块"
    [[ -f "$ZSHRC_FILE" ]] && \
    echo -e "  ${GREEN}${NC}  ~/.zshrc         已清除代理块"
    echo -e "  ${GREEN}${NC}  apt 代理         已移除"
    command -v git &>/dev/null && \
    echo -e "  ${GREEN}${NC}  git 全局代理     已移除"
    echo ""
}

# ── 子命令:ping ──────────────────────────────────────────────────────────────
cmd_ping() {
    local target="${1:-https://www.google.com}"
    local proxy_url
    proxy_url="$(get_proxy_url)"

    info "使用代理 ${CYAN}${proxy_url}${NC} 测试连接: ${BOLD}${target}${NC}"
    echo ""

    local start end elapsed http_code
    start=$(date +%s%3N)

    http_code=$(curl -s -o /dev/null -w "%{http_code}" \
        --proxy "$proxy_url" \
        --connect-timeout 10 \
        --max-time 15 \
        "$target" 2>&1) || true

    end=$(date +%s%3N)
    elapsed=$(( end - start ))

    if [[ "$http_code" =~ ^[23] ]]; then
        success "连通性: ${GREEN}正常${NC}  HTTP ${http_code}  耗时 ${elapsed}ms"
    elif [[ "$http_code" == "000" ]]; then
        error "连通性: 失败(连接超时或代理不可达)"
        exit 1
    else
        warn "连通性: 可到达但返回 HTTP ${http_code}  耗时 ${elapsed}ms"
    fi
}

# ── 子命令:status ────────────────────────────────────────────────────────────
cmd_status() {
    echo ""
    bold "═══ 代理状态检测 ═══"
    echo ""

    # 配置文件
    if load_config 2>/dev/null; then
        echo -e "  配置地址   ${GREEN}${NC}  ${CYAN}${PROXY_HOST}:${PROXY_PORT}${NC}  (${DIM}${CONFIG_FILE}${NC})"
    else
        echo -e "  配置地址   ${RED}${NC}  未配置(运行 proxy config <host>:<port>)"
    fi

    # 当前 shell 环境变量
    if [[ -n "${http_proxy:-}${HTTP_PROXY:-}" ]]; then
        local cur="${http_proxy:-${HTTP_PROXY:-}}"
        echo -e "  当前窗口   ${GREEN}${NC}  ${CYAN}${cur}${NC}"
    else
        echo -e "  当前窗口   ${DIM}${NC}  无代理环境变量"
    fi

    # rc 文件
    if _rc_has_proxy; then
        echo -e "  Shell RC   ${GREEN}${NC}  代理已写入 ~/.bashrc(新终端自动生效)"
    else
        echo -e "  Shell RC   ${DIM}${NC}  未设置"
    fi

    # apt
    if _apt_has_proxy; then
        echo -e "  apt 代理   ${GREEN}${NC}  ${DIM}${APT_PROXY_FILE}${NC}"
    else
        echo -e "  apt 代理   ${DIM}${NC}  未设置"
    fi

    # git
    if command -v git &>/dev/null && _git_has_proxy 2>/dev/null; then
        local gp
        gp=$(git config --global --get http.proxy 2>/dev/null || echo "")
        echo -e "  git 代理   ${GREEN}${NC}  ${CYAN}${gp}${NC}"
    else
        echo -e "  git 代理   ${DIM}${NC}  未设置"
    fi

    echo ""
}

# ── 子命令:config ────────────────────────────────────────────────────────────
cmd_config() {
    local host="" port=""

    load_config 2>/dev/null && {
        host="${PROXY_HOST:-}"
        port="${PROXY_PORT:-}"
    } || true

    if [[ $# -eq 0 ]]; then
        echo ""
        bold "═══ 代理配置向导 ═══"
        echo ""
        read -rp "  代理地址 (host:port,如 10.60.60.39:7890): " raw
        _parse_and_save "$raw"
        return
    fi

    case "$1" in
        -host|--host)
            [[ $# -ge 2 ]] || die "请提供 host 值: proxy config -host <host>"
            host="$2"
            validate_host "$host" || die "主机格式无效: $host"
            [[ -n "$port" ]] || die "尚未设置 port,请先运行: proxy config <host>:<port>"
            save_config "$host" "$port"
            success "host 已更新: ${CYAN}${host}:${port}${NC}"
            ;;
        -port|--port)
            [[ $# -ge 2 ]] || die "请提供 port 值: proxy config -port <port>"
            port="$2"
            validate_port "$port" || die "端口无效(1-65535): $port"
            [[ -n "$host" ]] || die "尚未设置 host,请先运行: proxy config <host>:<port>"
            save_config "$host" "$port"
            success "port 已更新: ${CYAN}${host}:${port}${NC}"
            ;;
        *)
            _parse_and_save "$1"
            ;;
    esac
}

_parse_and_save() {
    local raw="$1"
    raw="${raw#http://}"; raw="${raw#https://}"; raw="${raw%/}"

    if [[ "$raw" =~ ^(.+):([0-9]+)$ ]]; then
        local h="${BASH_REMATCH[1]}" p="${BASH_REMATCH[2]}"
        validate_host "$h" || die "主机格式无效: $h"
        validate_port "$p" || die "端口无效(1-65535): $p"
        save_config "$h" "$p"
        success "代理已配置: ${CYAN}${h}:${p}${NC}"
        info "运行 ${BOLD}proxy on${NC} 以启用代理"
    else
        die "格式错误,请使用 host:port,如: 10.60.60.39:7890"
    fi
}

# ── 子命令:help ──────────────────────────────────────────────────────────────
cmd_help() {
    echo ""
    bold "  proxy — Ubuntu 代理管理工具"
    echo -e "  ${DIM}版本 2.0  配置文件: ${CONFIG_FILE}${NC}"
    echo ""
    echo -e "  ${BOLD}用法${NC}"
    echo    "    proxy <命令> [选项]"
    echo ""
    echo -e "  ${BOLD}命令${NC}"
    echo ""
    echo -e "    ${CYAN}on${NC}  [-current|-global]   开启代理"
    echo -e "      ${DIM}proxy on                  (默认 -current,仅当前窗口有效)${NC}"
    echo -e "      ${DIM}proxy on -current         仅导出到当前 shell,关闭窗口后失效${NC}"
    echo -e "      ${DIM}proxy on -global          写入 ~/.bashrc + apt + git 全局代理${NC}"
    echo ""
    echo -e "    ${CYAN}off${NC}                      关闭并移除所有代理(当前窗口 + rc + apt + git)"
    echo ""
    echo -e "    ${CYAN}ping${NC}  [url]              测试代理连通性"
    echo -e "      ${DIM}proxy ping                          (默认 https://www.google.com)${NC}"
    echo -e "      ${DIM}proxy ping https://www.youtube.com  (指定测试地址)${NC}"
    echo ""
    echo -e "    ${CYAN}status${NC}                   显示代理状态(窗口 / RC / apt / git)"
    echo ""
    echo -e "    ${CYAN}config${NC}  <host:port>      配置代理地址"
    echo -e "      ${DIM}proxy config 10.60.60.39:7890       (一次设置 host 和 port)${NC}"
    echo -e "      ${DIM}proxy config -host 10.60.60.39      (单独更新 host)${NC}"
    echo -e "      ${DIM}proxy config -port 7890             (单独更新 port)${NC}"
    echo -e "      ${DIM}proxy config                        (交互式向导)${NC}"
    echo ""
    echo -e "    ${CYAN}help${NC}  [-h|--help]        显示此帮助"
    echo ""
    echo -e "  ${BOLD}快速开始${NC}"
    echo -e "    ${DIM}1. proxy config 10.60.60.39:7890${NC}"
    echo -e "    ${DIM}2. proxy on -global${NC}"
    echo -e "    ${DIM}3. proxy ping${NC}"
    echo ""
}

# ── 入口 ──────────────────────────────────────────────────────────────────────
main() {
    local cmd="${1:-help}"
    shift || true

    case "$cmd" in
        on)              cmd_on "$@" ;;
        off)             cmd_off ;;
        ping)            cmd_ping "$@" ;;
        status)          cmd_status ;;
        config)          cmd_config "$@" ;;
        help|-h|--help)  cmd_help ;;
        *)
            error "未知命令: $cmd"
            cmd_help
            exit 1
            ;;
    esac
}

main "$@"

install_proxy.sh

#!/usr/bin/env bash
# =============================================================================
# install_proxy.sh — proxy 工具安装脚本
# 用法: sudo bash install_proxy.sh
# =============================================================================

set -euo pipefail

INSTALL_PATH="/usr/local/bin/proxy"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROXY_SCRIPT="$SCRIPT_DIR/proxy"

RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
BOLD='\033[1m'
DIM='\033[2m'
NC='\033[0m'

info()    { echo -e "\033[0;34mℹ\033[0m  $*"; }
success() { echo -e "${GREEN}${NC}  $*"; }
warn()    { echo -e "${YELLOW}${NC}  $*"; }
error()   { echo -e "${RED}${NC}  $*" >&2; }
die()     { error "$*"; exit 1; }

# ── 检查 root ─────────────────────────────────────────────────────────────────
if [[ $EUID -ne 0 ]]; then
    die "请使用 sudo 运行安装脚本: sudo bash install_proxy.sh"
fi

# ── 检查依赖 ──────────────────────────────────────────────────────────────────
echo ""
echo -e "${BOLD}  proxy 安装程序${NC}"
echo -e "  ${DIM}正在检查依赖...${NC}"
echo ""

for dep in curl bash; do
    if command -v "$dep" &>/dev/null; then
        success "依赖 ${CYAN}${dep}${NC} 已安装"
    else
        die "缺少依赖: $dep  (请先安装: sudo apt install $dep)"
    fi
done

# ── 复制脚本 ──────────────────────────────────────────────────────────────────
echo ""
info "安装到 ${CYAN}${INSTALL_PATH}${NC} ..."

if [[ ! -f "$PROXY_SCRIPT" ]]; then
    die "未找到 proxy 脚本文件: $PROXY_SCRIPT  (请确保 proxy 和 install_proxy.sh 在同一目录)"
fi

cp "$PROXY_SCRIPT" "$INSTALL_PATH"
chmod 755 "$INSTALL_PATH"

success "脚本已安装: ${CYAN}${INSTALL_PATH}${NC}"

# ── 首次配置向导 ──────────────────────────────────────────────────────────────
echo ""
echo -e "  ${BOLD}首次配置${NC}"
echo ""

CONFIG_FILE="$HOME/.config/proxy-manager/config"
# 如果以 sudo 运行,CONFIG_FILE 应写入原始用户的 home
REAL_USER="${SUDO_USER:-$USER}"
REAL_HOME=$(getent passwd "$REAL_USER" | cut -d: -f6)
CONFIG_FILE="$REAL_HOME/.config/proxy-manager/config"

if [[ -f "$CONFIG_FILE" ]]; then
    warn "已检测到现有配置文件,跳过首次配置向导"
    info "如需修改代理地址,请运行: ${BOLD}proxy config <host>:<port>${NC}"
else
    read -rp "  请输入代理地址 (host:port,如 10.60.60.39:7890,回车跳过): " raw

    if [[ -n "$raw" ]]; then
        # 以原始用户身份执行配置
        sudo -u "$REAL_USER" "$INSTALL_PATH" config "$raw" || \
            warn "配置写入失败,请安装后手动运行: proxy config <host>:<port>"
    else
        warn "跳过配置,请稍后手动运行: proxy config <host>:<port>"
    fi
fi

# ── 完成 ──────────────────────────────────────────────────────────────────────
echo ""
echo -e "  ${GREEN}${BOLD}安装完成!${NC}"
echo ""
echo -e "  ${BOLD}快速上手${NC}"
echo -e "    ${DIM}proxy config 10.60.60.39:7890  # 配置代理地址${NC}"
echo -e "    ${DIM}proxy on                       # 开启代理(当前用户)${NC}"
echo -e "    ${DIM}proxy on -long                 # 开启系统级持久代理${NC}"
echo -e "    ${DIM}proxy ping                     # 测试连通性${NC}"
echo -e "    ${DIM}proxy status                   # 查看状态${NC}"
echo -e "    ${DIM}proxy off                      # 关闭代理${NC}"
echo -e "    ${DIM}proxy -h                       # 查看帮助${NC}"
echo ""