适用场景

适用于需要在 Linux Bash 中同时支持以下能力的环境:

  1. 默认代理;2) 会话级开关;3) 单命令级代理控制(不污染当前 shell)。

1. 设计目标

  • 代理配置单一来源:统一由 ~/proxy.sh 维护。
  • 会话级控制清晰:proxy-on / proxy-off。
  • 命令级控制独立:env-proxy / env-noproxy。
  • 避免状态污染:单命令代理通过子 shell + env 注入实现。

2. 文件职责

2.1 ~/proxy.sh(唯一代理变量源)

职责:定义并导出全部代理变量(小写与大写)。

标准示例(按当前环境):

#!/bin/bash
export http_proxy=http://192.168.114.9:7890 https_proxy=http://192.168.114.9:7890 all_proxy=socks5://192.168.114.9:7890
export no_proxy="localhost,127.0.0.1"
export no_proxy="$no_proxy,192.168.114.9,192.168.114.0/24,192.168.56.0/24,192.168.3.0/24"
export no_proxy="$no_proxy,gitlab.example.com,code.example.com,registry.example.com,example.com"

export HTTP_PROXY="$http_proxy"
export HTTPS_PROXY="$https_proxy"
export ALL_PROXY="$all_proxy"
export NO_PROXY="$no_proxy"

2.2 ~/.bashrc(交互式 shell)

职责:加载代理配置,并提供会话级/命令级控制函数。

标准片段:

export PATH="$HOME/.local/bin:$PATH"
source "$HOME/proxy.sh"

# 会话级开关(当前 shell)
proxy-on() {
    source "$HOME/proxy.sh"
    echo "proxy enabled: ${http_proxy:-$HTTP_PROXY}"
}

proxy-off() {
    unset http_proxy https_proxy all_proxy no_proxy
    unset HTTP_PROXY HTTPS_PROXY ALL_PROXY NO_PROXY
    echo "proxy disabled"
}

# 单命令走代理(不污染当前 shell)
env-proxy() {
    if [ $# -eq 0 ]; then
        echo "usage: env-proxy <command> [args...]"
        return 2
    fi

    (
        source "$HOME/proxy.sh"
        env \
            http_proxy="$http_proxy" https_proxy="$https_proxy" all_proxy="$all_proxy" no_proxy="$no_proxy" \
            HTTP_PROXY="$HTTP_PROXY" HTTPS_PROXY="$HTTPS_PROXY" ALL_PROXY="$ALL_PROXY" NO_PROXY="$NO_PROXY" \
            "$@"
    )
}

# 单命令禁用代理(不污染当前 shell)
env-noproxy() {
    env -u http_proxy -u https_proxy -u all_proxy -u no_proxy \
        -u HTTP_PROXY -u HTTPS_PROXY -u ALL_PROXY -u NO_PROXY \
        "$@"
}

2.3 ~/.profile(登录 shell)

职责:保证登录 shell 也能自动加载代理变量。

if [ -f "$HOME/proxy.sh" ]; then
    . "$HOME/proxy.sh"
fi

3. 生效机制

  • 交互式终端(如终端窗口)读取 ~/.bashrc。
  • 登录 shell(如 bash -l、部分 SSH 场景)读取 ~/.profile。
  • 当前终端立即生效:
source ~/.bashrc

4. 标准使用方式

4.1 会话级开关

proxy-on
proxy-off

4.2 单命令走代理(推荐)

env-proxy curl -v https://www.baidu.com
env-proxy git pull
env-proxy claude --version

4.3 单命令禁代理

env-noproxy codex --version
env-noproxy curl -I https://example.com

4.4 查看当前会话代理状态

env | grep -i 'proxy'

5. SSH 远程命令使用

远程命令默认通常是非登录、非交互 shell,可能不会自动加载代理变量。

推荐两种写法:

ssh <host> 'bash -lc "your_command"'
ssh <host> 'source ~/proxy.sh; your_command'

6. 故障排查

6.1 env-proxy 命令无效

检查:

type env-proxy

若未定义,执行:

source ~/.bashrc

6.2 某命令未走代理

检查工具是否识别小写/大写代理变量:

env-proxy env | grep -i 'proxy'

6.3 当前 shell 被意外污染

恢复:

proxy-off

7. 维护建议

  • ~/proxy.sh 作为唯一代理变量源,避免多处重复维护。
  • 新增内网地址时优先补到 no_proxy。
  • 日常优先用 env-proxy <cmd> / env-noproxy <cmd>,减少会话级状态切换带来的误操作。