—— 从 HTTP Basic denied 到 corkscrew not found
场景背景:
- 内部 Git(GitLab / 私有 Git)
- 需要 SSH + 代理 IP 才能访问
- 客户端使用 SourceTree(macOS)
- 遇到一系列看似不相关、实际强关联的问题
一、问题现象汇总
在一次看似“很普通”的 Git fetch 中,连续遇到多个问题:
1️⃣ HTTP 拉取失败
HTTP Basic: Access denied.
you're required to use a token instead of a password2️⃣ 切换 SSH 后,测试连接失败
ssh -T git@git.topu-internal.dev报错:
zsh:1: command not found: corkscrew
Connection closed by UNKNOWN port 655353️⃣ SourceTree 无法正常 fetch / pull
即使已经:
- 配置了 SSH Key
- Remote URL 改成了
git@xxx
二、问题本质拆解(非常关键)
❗ 本质 1:HTTP 密码认证被禁用
这是 Git 平台的安全策略升级,不是客户端问题:
- ❌ 用户名 + 密码
- ❌ HTTP Basic Auth
- ✅ Access Token
- ✅ SSH Key(推荐)
👉 解决方向:必须切 SSH 或 Token
❗ 本质 2:SSH 实际走了代理,但代理命令不存在
错误信息里最关键的一句是:
command not found: corkscrew说明:
- SSH 配置中 使用了
ProxyCommand corkscrew ... - 但系统中 根本没安装 corkscrew
- SSH 无法建立 TCP 通道
- 最终报出一个“看起来很玄学”的端口错误:
Connection closed by UNKNOWN port 65535⚠️ 这个 65535 不是目标端口,而是 ProxyCommand 失败后的兜底行为。
三、为什么会出现 corkscrew?
这是一个历史遗留问题:
- 早期 SSH 走 HTTP 代理的标准工具:
corkscrew - 很多旧教程 / 旧配置默认用它
但在现代系统中:
- ❌ 默认不安装
- ❌ 维护基本停止
- ❌ 只支持 HTTP CONNECT
四、正确且现代的解决方案(推荐)
✅ 使用 nc(netcat)作为 ProxyCommand
这是 OpenSSH 官方推荐方式,兼容性最好。
五、最终正确配置(核心)
~/.ssh/config
Host git.topu-internal.dev
HostName git.topu-internal.dev
User git
ProxyCommand nc -X 5 -x 127.0.0.1:1080 %h %p说明:
| 参数 | 含义 |
|---|---|
-X 5 | SOCKS5 代理 |
-x | 代理地址 |
%h %p | 目标主机和端口 |
如果是 HTTP 代理:
ProxyCommand nc -X connect -x 127.0.0.1:8080 %h %p六、验证方式(非常重要)
1️⃣ 终端验证(最权威)
ssh -T git@git.topu-internal.dev成功应看到:
Welcome to GitLab, @username!2️⃣ 查看 SSH 实际使用的代理命令
ssh -G git.topu-internal.dev | grep -i proxy输出示例:
proxycommand nc -X 5 -x 127.0.0.1:1080 %h %p👉 说明配置已生效
七、SourceTree 是否支持 SSH + 代理?
完全支持,而且是原生支持。
前提条件只有 3 个:
- Remote URL 是 SSH:
git@git.topu-internal.dev:group/repo.git- SourceTree 使用 OpenSSH
SourceTree → 设置 → Git → SSH 客户端:OpenSSH- 终端
ssh -T能通
只要终端能通,SourceTree 一定能通
SourceTree 本质只是调用 Git + OpenSSH
八、为什么之前会误以为是 SourceTree 的问题?
因为这类问题的错误传播路径很迷惑:
代理命令不存在
↓
SSH 建立失败
↓
Git fetch 失败
↓
SourceTree 提示网络 / 认证错误👉 真正的根因藏在 SSH 的 ProxyCommand 里
九、排错 Checklist(以后直接对)
# 1. 是否还在用 https
git remote -v
# 2. SSH 是否能直连
ssh -T git@git.xxx
# 3. SSH 实际用的代理
ssh -G git.xxx | grep proxy
# 4. corkscrew 是否还被引用
grep -R corkscrew ~/.ssh十、经验总结
❗ Git / SourceTree 出问题,先看 SSH,不要先怀疑 Git
❗ 代理相关问题,80% 是 ProxyCommand
❗ nc > corkscrew(现代环境)
附:如果一定要用 corkscrew(不推荐)
brew install corkscrew但强烈建议直接迁移到 nc。