From ade28ad50d9e88cd9cab16c1f42cca73306bb221 Mon Sep 17 00:00:00 2001 From: cnphpbb Date: Fri, 19 Jun 2026 11:29:29 +0800 Subject: [PATCH] =?UTF-8?q?feat(shell):=20=E6=B7=BB=E5=8A=A0=E4=BB=A3?= =?UTF-8?q?=E7=90=86=E9=85=8D=E7=BD=AE=E7=AE=A1=E7=90=86=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 提供 proxy_on / proxy_off / proxy_status / proxy_test 四个函数,支持 HTTP/HTTPS/SOCKS 代理的快速启停、 状态查看与连通性测试(含本地端口探测与外网访问验证)。 --- shell/proxy.sh | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 shell/proxy.sh diff --git a/shell/proxy.sh b/shell/proxy.sh new file mode 100644 index 0000000..ab63e6b --- /dev/null +++ b/shell/proxy.sh @@ -0,0 +1,95 @@ +#!/usr/bin/env bash + +# 代理配置 - 请根据实际情况修改以下值 +PROXY_HOST="127.0.0.1" +PROXY_HTTP_PORT="7890" +PROXY_SOCKS_PORT="7890" + +# HTTP/HTTPS 代理地址 +HTTP_PROXY_URL="http://${PROXY_HOST}:${PROXY_HTTP_PORT}" +SOCKS_PROXY_URL="socks5://${PROXY_HOST}:${PROXY_SOCKS_PORT}" + +# 不使用代理的地址 +NO_PROXY_VALUE="localhost,127.0.0.1,localaddress,.localdomain.com,.example.com,.hermesagent.org.cn,mcp.hermesagent.org.cn" + +function proxy_on() { + export http_proxy="${HTTP_PROXY_URL}" + export https_proxy="${HTTP_PROXY_URL}" + export all_proxy="${SOCKS_PROXY_URL}" + export no_proxy="${NO_PROXY_VALUE}" + + # 同时设置大写版本(某些程序需要) + export HTTP_PROXY="${HTTP_PROXY_URL}" + export HTTPS_PROXY="${HTTP_PROXY_URL}" + export ALL_PROXY="${SOCKS_PROXY_URL}" + export NO_PROXY="${NO_PROXY_VALUE}" + + echo -e "\033[32m┌──────────────────────────────────────┐" + echo "│ ✅ 代理已启用 │" + echo "├──────────────────────────────────────┤" + echo "│ http_proxy : ${HTTP_PROXY_URL}" + echo "│ https_proxy: ${HTTP_PROXY_URL}" + echo "│ all_proxy : ${SOCKS_PROXY_URL}" + echo "└──────────────────────────────────────┘\033[0m" +} + +function proxy_off() { + unset http_proxy https_proxy all_proxy no_proxy + unset HTTP_PROXY HTTPS_PROXY ALL_PROXY NO_PROXY + + echo -e "\033[31m┌──────────────────────────────────────┐" + echo "│ ❌ 代理已关闭 │" + echo "└──────────────────────────────────────┘\033[0m" +} + +function proxy_status() { + echo -e "\033[36m┌──────────────────────────────────────┐" + echo "│ 📊 代理状态 │" + echo -e "├──────────────────────────────────────┤\033[0m" + + if [ -z "$http_proxy" ]; then + echo -e "\033[31m│ 状态: 未启用 │\033[0m" + else + echo -e "\033[32m│ 状态: 已启用 │\033[0m" + echo "│ http_proxy : $http_proxy" + echo "│ https_proxy: $https_proxy" + echo "│ all_proxy : $all_proxy" + echo "│ no_proxy : $no_proxy" + fi + + echo -e "\033[36m└──────────────────────────────────────┘\033[0m" +} + +function proxy_test() { + # 检查 curl 是否可用 + if ! command -v curl >/dev/null 2>&1; then + echo "curl 未安装,无法测试代理" >&2 + return 1 + fi + + echo -e "\033[33m测试代理连通性...\033[0m" + + # 1. 本地代理端口是否在监听(不依赖外网,最快的失败定位) + echo -n "代理端口 ${PROXY_HOST}:${PROXY_HTTP_PORT}: " + if (exec 3<>/dev/tcp/"${PROXY_HOST}"/"${PROXY_HTTP_PORT}") 2>/dev/null; then + exec 3<&- 3>&- + echo -e "\033[32m✓ 可达\033[0m" + else + echo -e "\033[31m✗ 不可达(请确认代理客户端已启动)\033[0m" + return 1 + fi + + # 2. 通过代理访问稳定可达的国内站点(连通性测试,非翻墙测试) + echo -n "代理访问 https://www.baidu.com: " + code=$(curl -s -o /dev/null -w "%{http_code}" --max-time 8 \ + -x "${HTTP_PROXY_URL}" https://www.baidu.com 2>/dev/null) + if [ -n "$code" ] && [ "$code" -ge 200 ] && [ "$code" -lt 400 ]; then + echo -e "\033[32m✓ HTTP ${code}\033[0m" + else + echo -e "\033[31m✗ 失败(${code:-N/A})\033[0m" + fi + + # 3. 显示当前出口 IP(直连,便于与走代理后的 IP 对比) + echo -n "当前出口 IP: " + curl -s --max-time 5 https://api.ipify.org 2>/dev/null || echo "获取失败" +}