🛰️ 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 配置时需要
一键安装
将 proxy 和 install_proxy.sh 两个文件放在同一目录,执行:
chmod +x proxy install_proxy.sh
sudo bash install_proxy.sh
安装脚本会自动:
- 检查
curl/bash依赖是否存在 - 将
proxy复制到/usr/local/bin/,注册为全局命令 - 引导你完成首次代理地址配置(可回车跳过)
✅ 提示:安装完成后无需重新登录,
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/95proxy | apt 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 install、git 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 ""