You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

关键注意事项

  1. EOF引号规则:使用<<EOF(不带单引号)让Bitbucket流水线提前替换所有${xxx}变量,避免EC2主机上因变量未定义导致的错误
  2. SSH参数:添加-o StrictHostKeyChecking=no跳过首次连接的主机密钥验证,适配流水线的无交互环境
  3. 容器管理优化:用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 08:31:06