Bitbucket流水线无法通过SSH连接EC2实例问题求助
问题解决:Bitbucket流水线部署EC2时SSH身份验证失败
错误核心分析
报错Warning: Identity file @ not accessible: No such file or directory本质是SSH命令的-i参数未指向有效的密钥文件:
- 直接传递原始PEM内容给
-i参数(而非文件路径)会导致解析错误 - Base64解码生成密钥文件时,可能存在格式或权限问题
正确配置方案
方式一:Base64解码密钥文件(推荐)
将EC2 PEM密钥转换为无换行的Base64字符串(执行base64 -w 0 your-key.pem生成),存储为仓库变量EC2_KEY_BASE64,然后使用以下流水线配置:
- step: name: Deploy to EC2 script: # 将Base64解码为PEM文件,存储到临时目录 - echo "${EC2_KEY_BASE64}" | base64 -d > /tmp/ec2-key.pem # 设置SSH要求的严格权限(避免密钥被拒绝) - chmod 600 /tmp/ec2-key.pem # 执行EC2部署命令 - | ssh -o StrictHostKeyChecking=no -i /tmp/ec2-key.pem ${EC2_USER}@${EC2_HOST} <<EOF # 停止所有运行中的容器(无容器时不执行) docker ps -q | xargs -r docker stop # 登录Docker仓库(变量由Bitbucket流水线替换) echo ${DOCKER_PASSWORD} | docker login --username ${DOCKER_USERNAME} --password-stdin # 拉取最新镜像 docker pull ${DOCKER_REPO}/${IMAGE_NAME}:${IMAGE_VERSION} # 清理旧容器(避免名称冲突) docker rm -f my_container_name || true # 启动新容器 docker run -d --name my_container_name ${DOCKER_REPO}/${IMAGE_NAME}:${IMAGE_VERSION} EOF services: - docker
关键注意事项
- EOF引号规则:使用
<<EOF(不带单引号)让Bitbucket流水线提前替换所有${xxx}变量,避免EC2主机上因变量未定义导致的错误 - SSH参数:添加
-o StrictHostKeyChecking=no跳过首次连接的主机密钥验证,适配流水线的无交互环境 - 容器管理优化:用
xargs -r docker stop替代原逻辑,避免无容器时执行docker stop报错;启动前删除旧容器确保名称唯一
问题排查步骤
如果仍报错,可在流水线中添加以下命令验证:
- 检查解码后的密钥内容:
cat /tmp/ec2-key.pem - 确认文件权限:
ls -l /tmp/ec2-key.pem(需显示-rw-------) - 测试SSH连接:
ssh -v -i /tmp/ec2-key.pem ${EC2_USER}@${EC2_HOST}(-v输出详细日志)
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

