根本原因是Git在SSH认证失败后静默等待密码输入,而Composer不接管stdin导致进程挂起;解决方法是确保ssh-agent已启动并加载密钥,或配置Git将HTTPS自动转为SSH。

composer install 卡在 SSH 凭据询问怎么办
根本原因是 Composer 调用 git clone 时,Git 发现目标仓库是 SSH 地址(如 git@github.com:org/repo.git),但本地未配置密钥或 agent 未加载,于是尝试交互式提示输入密码——而 Composer 在非交互模式下无法响应,进程就挂住或超时失败。
这不是 Composer 自己在问,而是 Git 底层行为。解决方向只有两个:让 Git 能静默认证,或让 Git 根本不走 SSH。
- 先确认你用的是 SSH URL:检查
composer.json中repositories的url字段是否为git@xxx:开头;HTTPS 地址不会触发 SSH 提示,但需要 Token - 运行
ssh -T git@github.com(或你的 Git 域名)验证连通性;失败就别往下试,得先配密钥 - 确保
ssh-agent已启动且私钥已加载:ssh-add -l应列出密钥;没输出就执行ssh-add ~/.ssh/id_rsa(路径按实际调整) - 若用 Docker 或 CI 环境,注意
ssh-agent不会自动继承,需在构建步骤中显式启动并加载密钥
为什么加 --no-interaction 还卡在 SSH 提示
--no-interaction(或 -n)只跳过 Composer 层的 yes/no、模板选择等交互,它不干预 Git 底层行为。Git 的 SSH 密码提示发生在系统调用层面,Composer 无权屏蔽。
所以加了 -n 仍卡住,说明问题不在 Composer,而在 Git 认证链断了。
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
-
COMPOSER_NO_INTERACTION=1环境变量和-n效果一致,不能解决 SSH 卡顿 - 不要指望
auth.json对 SSH 地址生效——它只管 HTTP Basic 和 OAuth,对git@地址完全无效 - 某些旧版 Git(url.insteadOf 注入凭据,会导致 HTTPS fallback 失败,间接暴露 SSH 问题
用 git config --global url..insteadOf 强制转协议
如果你无法部署 SSH 密钥(比如受限服务器),最稳妥的绕过方式是让 Git 把所有对 GitHub/GitLab 的 HTTPS 请求,自动重写成带 Token 的 HTTPS URL,彻底避开 SSH。
这需要两步配合:
- 在
composer.json中把私有仓库 URL 改成 HTTPS 格式:"url": "https://github.com/org/private-repo.git" - 执行 Git 全局替换:
git config --global url."https://<code>YOUR_TOKEN@github.com/".insteadOf "https://github.com/" - Token 必须是 GitHub classic token(勾选
reposscope)或 GitLab Personal Access Token(read_repository) - 验证是否生效:
git ls-remote https://github.com/org/private-repo.git应返回 refs,不报 401
SSH 配置中最容易被忽略的权限和路径细节
很多“明明配好了却还是失败”的情况,都栽在文件权限或路径错位上。
-
~/.ssh/id_rsa和~/.ssh/id_rsa.pub权限必须是600和644,否则 OpenSSH 拒绝读取;CI 环境里常因 COPY 或 chown 错误导致权限变 644 或 755 -
~/.ssh/config中 Host 别名必须与 URL 中域名严格匹配;例如url是git@gitlab.example.com:group/repo.git,则Host行必须写gitlab.example.com,不能写gitlab或带端口 - Docker 构建中,
ssh-agent启动后,后续 RUN 命令默认不继承 agent socket,需用SSH_AUTH_SOCK环境变量透传,或改用docker build --ssh(仅 Docker BuildKit 支持) - Windows 上 Git Bash 与 WSL 的 SSH 配置不互通,别在 WSL 里配好,再用 Git Bash 执行 composer install

















