zsh中实现代理一键开关需用函数封装on/off逻辑,绑定proxy命令,确保仅当前会话生效、重启默认关闭:添加proxy()函数至~/.zshrc,支持proxy on/off/status,替换your-proxy-host:port为实际地址。
在 zsh 中实现代理环境变量的一键开关,核心不是硬编码写死 export http_proxy=...,而是用函数封装「设」和「清」两套逻辑,并绑定到简短命令(比如 proxy on / proxy off),同时确保它对当前终端会话生效、不污染其他会话、且重启终端后默认关闭(安全优先)。
下面是一套轻量、可靠、可直接粘贴进 ~/.zshrc 的方案:
✅ 1. 在 ~/.zshrc 里添加代理控制函数
打开终端,运行:
code ~/.zshrc # 或用 nano:nano ~/.zshrc
在文件末尾粘贴以下内容(请按需替换 your-proxy-host:port 和认证信息):
# --- 代理一键开关函数 ---
proxy() {
local cmd="${1:-status}"
case "$cmd" in
on)
export http_proxy="http://your-proxy-host:port"
export https_proxy="http://your-proxy-host:port"
export all_proxy="socks5://your-proxy-host:port" # 如用 socks 代理
# 可选:跳过代理的地址(如公司内网、本地服务)
export no_proxy="localhost,127.0.0.1,.example.com,192.168.0.0/16"
echo "✅ 代理已启用:$http_proxy"
;;
off)
unset http_proxy https_proxy all_proxy no_proxy
echo "❌ 代理已关闭"
;;
status)
if [[ -n "$http_proxy" ]]; then
echo "? 当前代理:$http_proxy"
else
echo "? 代理未启用"
fi
;;
*)
echo "Usage: proxy {on|off|status}"
;;
esac
}⚠️ 注意替换:
-
your-proxy-host:port→ 换成你真实的代理地址,例如127.0.0.1:7890(Clash)、127.0.0.1:8080(Charles)、或公司 HTTP 代理; - 若需用户名密码,写成
http://user:pass@host:port(注意 URL 编码特殊字符); -
all_proxy仅在支持它的命令(如 curl、git、wget)中生效,http_proxy/https_proxy覆盖更广。
✅ 2. 重载配置并测试
保存文件后,在当前终端执行:
source ~/.zshrc
然后试试:
proxy on # 启用 curl -I https://httpbin.org/ip # 应走代理(返回代理出口 IP) proxy status # 查看状态 proxy off # 关闭 curl -I https://httpbin.org/ip # 应走本机出口
✅ 3. 进阶建议(按需启用)
-
只对特定命令启用代理?
不要用全局export,改用前缀调用:https_proxy=http://127.0.0.1:7890 curl -I https://httpbin.org/ip
-
Git 单独走代理?
用 Git 自身配置更稳妥(不受 shell 环境影响):git config --global http.proxy http://127.0.0.1:7890 git config --global https.proxy http://127.0.0.1:7890
开机自动关代理?
默认就是——因为~/.zshrc不自动设置代理,proxy on是手动触发的,新终端天然干净。这是最安全的做法。想让终端启动时默认开代理?
❌ 不推荐。如真有此需,可在~/.zshrc末尾加一行proxy on,但务必清楚风险:所有终端、IDE 内置终端、脚本都会继承,可能干扰 CI/本地服务调试。
不依赖插件、不修改系统级配置、不污染 $PATH,纯函数封装,开和关都即时生效,也方便加到 alias 或快捷键里(比如 iTerm2 设置 proxy on 绑定 ⌘+P)。

















