composer install 卡在密码输入是因为 git 在 ssh 认证失败后退化为 https 密码提示,而 composer 不接管 stdin;根本解法是确保 git 能静默通过 ssh 连接,包括验证密钥、配置 ssh-agent、修正 ~/.ssh/config 和 url 替换规则。

为什么 composer install 会卡在密码输入?
因为 Composer 默认走 HTTPS 协议拉取私有 Git 包时,若仓库配置为 git@github.com:user/repo.git 这类 SSH 地址,但本地没配好 SSH 密钥或代理,就会退化到 Git 的密码提示——而 Composer 不接管 stdin,直接卡住。这不是 Composer 的 bug,是 Git 在尝试 fallback 认证。
怎么让 Composer 真正走 SSH 并跳过密码?
关键不是改 Composer 配置,而是确保 Git 自身能静默通过 SSH 连接。Composer 只是调用 git clone,它不参与密钥管理。
- 确认私有包的
composer.json中repositories项用的是 SSH URL(如"url": "git@github.com:org/private-package.git"),不是 HTTPS - 运行
ssh -T git@github.com(或对应 Git 服务商域名)验证密钥是否已加载且权限正确;失败就说明问题不在 Composer - 如果用了
~/.ssh/config,确保 Host 别名与 Git URL 中的 host 一致(例如Host github.com对应git@github.com) - 避免混用 HTTPS 和 SSH:某些私有 Packagist 服务(如 Satis、Private Packagist)若配置了 HTTPS 源,Composer 仍会走 HTTPS,此时 SSH 密钥无效
git config --global url."git@github.com:".insteadOf "https://github.com/" 有用吗?
有用,但只解决“URL 替换”这一层。它让所有原本写成 https://github.com/user/repo 的依赖,自动转成 git@github.com:user/repo 再走 SSH。
- 仅对 GitHub 有效?不,可适配任意域名:
git config --global url."git@gitlab.example.com:".insteadOf "https://gitlab.example.com/" - 注意斜杠和冒号位置:
insteadOf后必须带协议前缀和尾部斜杠,否则不匹配 - 它不解决密钥本身的问题——替换后还是得靠
ssh-agent或~/.ssh/id_rsa正常工作 - 慎用于团队项目:这个配置是全局的,可能影响其他非 Composer 的 Git 操作
CI 环境下 SSH 密钥经常失败?
CI(如 GitHub Actions、GitLab CI)里最常漏掉的是 agent 初始化和私钥格式。
- GitHub Actions 必须显式启动 ssh-agent:
eval $(ssh-agent -s),再用ssh-add - 私钥内容不能带 Windows 换行符(
\r\n),否则ssh-add静默失败;建议用tr -d '\r'清理 - GitLab CI 若用
SSH_KNOWN_HOSTS,记得把目标 Git 服务器的公钥指纹加进去,否则 SSH 连接会因未知 host 被拒绝 - 别在
composer.json里硬编码git@...然后又在 CI 里强制走 HTTPS——这等于自己绕开 SSH
git clone git@xxx,看真实报错再下手。










