适用场景
适用于需要在 Linux Bash 中同时支持以下能力的环境:
- 默认代理;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>,减少会话级状态切换带来的误操作。