Bitbucket Pipeline通过SCP部署时SSH主机密钥验证失败求助
解决Bitbucket Pipelines部署React应用时SCP的Host key verification failed问题
问题背景
首次尝试通过Bitbucket Pipelines将React.js应用构建部署到SSH端口为9500的服务器,已在仓库Pipelines设置中配置密钥对和已知主机,本地Windows环境下密钥对可无密码SSH登录,但Pipelines中SCP上传始终报错Host key verification failed。即使手动在脚本中添加ssh-keyscan写入known_hosts,执行cat ~/.ssh/known_hosts能看到目标主机条目,问题依然存在。
核心排查方向
- 已知主机条目格式错误:非默认22端口的SSH主机,known_hosts必须使用
[主机名]:端口的格式,否则Bitbucket Pipelines无法匹配主机密钥。 - 手动脚本配置干扰默认机制:Bitbucket Pipelines会自动加载你在设置中配置的SSH私钥和已知主机,手动创建~/.ssh目录、写入密钥的操作可能覆盖或破坏默认配置。
- SCP未指定正确私钥:默认情况下SCP可能不会自动使用Bitbucket配置的私钥,需要显式指定。
解决方案
1. 修正Bitbucket已知主机格式
登录Bitbucket仓库,进入Settings > Pipelines > SSH keys,在Known hosts区域:
- 删除现有错误格式的主机条目
- 在本地Windows终端执行
ssh-keyscan -p 9500 myserver.com,复制输出的完整条目(格式为[myserver.com]:9500 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ...) - 将复制的条目粘贴到Bitbucket的Known hosts中并保存
2. 简化Pipelines脚本
移除所有手动操作SSH配置的冗余代码,利用Bitbucket的自动加载机制,同时显式指定私钥路径确保SCP使用正确密钥:
image: node:16 pipelines: default: - step: name: Build and Deploy caches: - node script: - npm install - npm run build # 显式指定私钥路径和端口 - scp -P 9500 -i ~/.ssh/id_rsa -r ./build/* myusername@myserver.com:/home/myusername/songs/songstest
3. 启用调试日志定位问题
如果问题仍存在,在脚本中添加SSH/SCP的调试参数,查看详细连接日志:
script: # ... 构建步骤 # 测试SSH连接并输出详细日志 - ssh -v -p 9500 myusername@myserver.com "echo 'SSH Test Passed'" # 或调试SCP上传 - scp -v -P 9500 -i ~/.ssh/id_rsa ./build/* myusername@myserver.com:/home/myusername/songs/songstest
通过-v参数的输出,可以明确看到是主机密钥不匹配、密钥认证失败还是其他权限问题。
4. 服务器端配置检查
- 确认服务器
/etc/ssh/sshd_config中开启了PubkeyAuthentication yes - 检查服务器上
/home/myusername/.ssh/authorized_keys文件,确保已添加与Bitbucket私钥配对的公钥 - 确认服务器防火墙允许9500端口的SSH连接
内容的提问来源于stack exchange,提问作者MrMoxy
相关产品推荐
相关产品推荐

