Composer install 卡在 Cloning 是因 SSH 认证失败后 Git 静默等待密码输入,而 Composer 不接管 stdin;需检查密钥加载、~/.ssh/config 匹配、/etc/hosts 解析、Git insteadOf 规则、CI 中 ssh-agent/known_hosts/端口配置。

Composer 能拉取内网 Git 仓库,但必须绕过“私有网段不可达”这个假象——问题从来不在网络隔离,而在 SSH 鉴权链断裂或 Git 协议未被正确触发。
为什么 composer install 卡在 Cloning into 'xxx' 且无报错?
这不是网络超时,是 Git 在 SSH 认证失败后静默 fallback 到密码输入,而 Composer 不接管 stdin,直接挂起。你看到的“卡住”,其实是 Git 在等你敲回车输密码(但它根本不会出现提示)。
- 运行
ssh -T git@your-git-server.internal,如果返回Permission denied (publickey),说明密钥没加载或~/.ssh/config里 Host 配置不匹配 - 检查
ssh-add -l是否列出对应密钥;没列就执行ssh-add ~/.ssh/id_rsa_internal(路径按实际调整) - 确认
~/.ssh/config中 Host 域名与 Git URL 完全一致,例如:Host git-server.internal对应git@git-server.internal:group/repo.git - 内网域名可能不被 DNS 解析,可在
/etc/hosts加一行:10.1.2.3 git-server.internal
composer.json 里写 SSH 地址却仍走 HTTPS?
Composer 不决定协议,Git 决定。你写的 git@git-server.internal:group/repo.git 是对的,但若本地 Git 配置了 insteadOf 规则把 SSH 替换成了 HTTPS,或者仓库 URL 被其他工具重写过,就会失效。
- 检查全局 Git 配置:
git config --global --get-regexp "url.*insteadOf",如有匹配项且指向 HTTPS,用git config --global --unset url."https://git-server.internal/".insteadOf清除 - 确保
composer.json中repositories的url字段是纯 SSH 格式,不含https://或http:// - 不要依赖
composer config -g github-oauth——它对内网 Git 服务器完全无效,那是给 Packagist API 用的
CI/CD 环境下 SSH 连接失败的三个硬伤
本地能通 ≠ CI 能通。GitHub Actions、GitLab CI、自建 Jenkins 都容易栽在这三处:
-
ssh-keyscan git-server.internal >> ~/.ssh/known_hosts必须显式执行,否则首次连接因 host key 未验证而阻塞 - 私钥内容若含 Windows 换行符(
\r\n),ssh-add会静默失败;建议注入前用tr -d '\r'清理 - SSH agent 未启动:GitHub Actions 需先
eval $(ssh-agent -s),再ssh-add
最常被忽略的是:内网 Git 服务器的 SSH 端口可能不是 22。如果用了非标端口(比如 2222),~/.ssh/config 必须明确写 Port 2222,且 url 要写成 git@git-server.internal:2222/group/repo.git —— 少一个环节,整条链就断了。











