1. 令人绝望的代码拉取地狱
如果您是一名在中国大陆从事软件开发的程序员,那么下面这些报错画面,大概率深深地刻在您的 DNA 里,并曾经浪费了您无数个宝贵的摸鱼小时:
- 在 GitHub 上看到一个牛逼的开源项目,兴冲冲地在终端敲下
git clone https://...,进度条在0%卡了十分钟后,弹出一句冰冷的fatal: unable to access... Connection timed out。 - 接手一个新项目,满怀期待地跑了一句
npm install,看着满屏的fetch failed,被迫去寻找各种不知多久没更新的国内淘宝镜像源,结果装出了一堆诡异的依赖版本冲突 Bug。 - 部署服务器时
docker pull ubuntu:latest,速度在几 kbps 徘徊,最后context canceled。
您愤怒地看向右上角那亮着绿色小对勾的 Clash 或 v2ray 客户端,打开浏览器测速跑到了 500Mbps:“我明明开了全局代理,这破终端是瞎了吗?”
终端没瞎,它是真的“看不见”。今天,我们将彻底治好各种命令行工具的“断网综合征”,让您的开发环境真正做到如丝般顺滑。
2. 盲区大扫除:终端为什么不走系统代理?
当您在代理软件中点击“开启系统代理”时,它只在 Windows 注册表或 macOS 的网络设置里写下了一句指令。这种图形界面层的协议,只有 Chrome 这类高度集成操作系统的“文明软件”才会遵守。
而像 Git、Curl、Python 的 pip、Node.js 的 npm,这些诞生于极其硬核的 Linux/Unix 命令行时代的工具,它们有着极其固执的独立网络栈。它们的原则是:“除非你把代理地址极其明确地、以环境变量的形式贴在我的脑门上,或者写在我的专属配置文件里,否则我哪怕撞墙撞死,也只认物理网卡!”
了解了这种偏执,我们就能对症下药。
3. 处方一:最轻量、最安全的临时环境变量注入 (Mac/Linux/Windows)
如果您只是偶尔需要让终端里的某条命令翻墙,这是最推荐的做法。
假设您的代理软件在本地开放的代理端口是 7890(Clash 系列默认):
Mac / Linux (Bash 或 Zsh) 用户:
在终端中执行以下两行魔法咒语:
export http_proxy="http://127.0.0.1:7890"
export https_proxy="http://127.0.0.1:7890"
执行完后,您再输入 curl -I https://www.google.com,就会发现瞬间连通。注意:这种环境变量只在当前这个终端窗口、且在关闭之前有效。 关掉重开,代理立刻失效。这就完美保证了您平时直连内网服务器不会受到干扰。
进阶玩法:把它写成别名 (Alias)
每次手敲太累?编辑您的 ~/.zshrc 或 ~/.bash_profile,加入:
alias proxy="export http_proxy=http://127.0.0.1:7890;export https_proxy=http://127.0.0.1:7890; echo '终端代理已开启🚀'"
alias unproxy="unset http_proxy https_proxy; echo '终端代理已关闭🛑'"
以后在终端里,只需敲一个单词 proxy,整条街的海外代码任你疯狂拉取。
4. 处方二:给极度顽固分子 Git 强行刻下规矩
有时候即使您配置了全局环境变量,遇到某些特殊的 Git 仓库(比如极其庞大的底层源码库,使用 SSH 协议拉取时),Git 依然会脱缰。
我们必须直接修改 Git 的全局配置文件,强制它使用我们的本地 SOCKS5 或 HTTP 代理。在终端中执行:
# 配置只让 github.com 走代理(极其推荐的精准分流)
git config --global http.https://github.com.proxy http://127.0.0.1:7890
git config --global https.https://github.com.proxy http://127.0.0.1:7890这样设置后,您去拉取公司内网的 GitLab 仓库时完全直连满速,而去拉取 GitHub 时则如火箭般起飞,永不冲突。如果以后不想用了,可以通过 git config --global --unset 取消掉。
5. 处方三:最头疼的骨灰级顽疾 —— Docker Daemon
为什么 Docker 最让人头疼?因为当您在终端输入 docker pull ... 时,终端里的这个 docker 命令其实只是个传话筒(Client),真正去海外拉取庞大镜像的,是潜伏在系统后台深处的 Docker 守护进程 (Docker Daemon)。
守护进程是在系统开机时由 systemd 启动的,它根本不鸟您在普通用户终端里设置的那些 export http_proxy 环境变量!
给 Docker 彻底手术的步骤(以 Ubuntu/Debian 为例):
- 为 docker 服务创建一个专用的 systemd 补丁目录:
sudo mkdir -p /etc/systemd/system/docker.service.d - 在这个目录下创建一个名为
http-proxy.conf的文件:
sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf - 在文件中强行注入代理配置(假设代理软件跑在同一台机器的 7890 端口):
[Service] Environment="HTTP_PROXY=http://127.0.0.1:7890" Environment="HTTPS_PROXY=http://127.0.0.1:7890" Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.somecorporation.com" - 保存后,重载系统配置并重启极其固执的 Docker 服务:
sudo systemctl daemon-reload
sudo systemctl restart docker
再次 docker pull,看着那些以 GB 计算的镜像文件以几十兆每秒的速度倾泻而下,那种身为程序员掌控一切的快感,无以言表。
6. 终极偷懒大招:TUN 虚拟网卡模式接管一切
如果您觉得上面各种改配置、写脚本的过程实在太折磨人。那么,请回看我们之前写过的《TUN 模式终极指南》。
无论您是在 Windows 下使用 Clash Verge Rev,还是在 macOS 下使用 Surge,只要您开启了拥有最高内核权限的 TUN 模式 (增强模式),它就会在操作系统的最底层改写物理路由表。
在这把名为“强权”的达摩克利斯之剑下,管你是骄傲的 Git,还是藏在阴暗角落里的 Docker Daemon 进程,所有的数据包只要一离开网卡,就会被强行吸入代理隧道,乖乖服从您的分流规则。您什么终端变量都不用设,打开即用,这才是人民币玩家最朴实无华的枯燥体验。