Karp 的技术博客

—— 从 HTTP Basic deniedcorkscrew 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 password

2️⃣ 切换 SSH 后,测试连接失败

ssh -T git@git.topu-internal.dev

报错:

zsh:1: command not found: corkscrew
Connection closed by UNKNOWN port 65535

3️⃣ 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 5SOCKS5 代理
-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 个:

  1. Remote URL 是 SSH:
git@git.topu-internal.dev:group/repo.git
  1. SourceTree 使用 OpenSSH
SourceTree → 设置 → Git → SSH 客户端:OpenSSH
  1. 终端 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

版权属于:karp
作品采用:本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
更新于: 2026年01月28日 08:56
0

目录

来自 《[踩坑] 一次 SSH + Git + SourceTree 代理》