GitHub Actions中SSH连接失败:Host key verification failed问题解决
解决方案
1. 修正GitHub Actions Workflow配置
先修改部署步骤,将密钥和必要变量通过环境变量传递给shell脚本,避免在脚本中直接使用GitHub Actions模板语法:
deploy: name: Deploy to ECR runs-on: ubuntu-latest env: SSH_USER: ubuntu SSH_HOST: 13.234.201.241 SSH_PORT: 22 SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} CONTAINER_NAME: your-container-name # 替换为你的实际容器名称 LOCAL_PORT: your-local-port # 替换为你的实际端口号 ECR_REGISTRY: 714116641665.dkr.ecr.us-east-1.amazonaws.com steps: - name: Checkout code uses: actions/checkout@v4 # 确保代码被检出,避免找不到release.sh - name: Release run: | chmod +x ./release.sh ./release.sh
2. 修正release.sh脚本
更新脚本,改用环境变量调用密钥,同时处理SSH主机密钥验证问题:
#!/bin/bash # 处理SSH主机密钥验证,解决"Host key verification failed"错误 ssh-keyscan -p "${SSH_PORT}" "${SSH_HOST}" >> ~/.ssh/known_hosts # 创建SSH私钥文件,用-e保留密钥中的换行符 echo -e "$SSH_PRIVATE_KEY" > ./ssh_private_key chmod 600 ./ssh_private_key # 删除现有Docker容器 ssh -i ./ssh_private_key -p "${SSH_PORT}" "${SSH_USER}@${SSH_HOST}" "docker rm -f ${CONTAINER_NAME}" # 登录ECR ssh -i ./ssh_private_key -p "${SSH_PORT}" "${SSH_USER}@${SSH_HOST}" << EOF aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin ${ECR_REGISTRY} EOF # 清理临时密钥文件 rm ./ssh_private_key
关键问题说明
bad substitution错误
你在shell脚本中直接写了${{ secrets.SSH_PRIVATE_KEY }},这是GitHub Actions的模板语法,bash无法解析。必须通过Workflow的env字段把密钥转成环境变量,再在脚本里用$SSH_PRIVATE_KEY调用。Host key verification failed错误
GitHub Actions的Runner是临时环境,首次连远程服务器不会自动信任主机密钥。用ssh-keyscan把目标服务器的主机密钥加到known_hosts里,就能跳过手动验证。未定义变量问题
脚本里的${CONTAINER_NAME}和${LOCAL_PORT}之前没在Workflow里定义,必须在env字段补充这些变量的实际值,否则脚本执行时会出现空值错误。私钥格式问题
用echo -e写入私钥,能保留密钥里的换行符,否则SSH会因为密钥格式错误拒绝连接。
内容的提问来源于stack exchange,提问作者Hrushi
相关产品推荐
相关产品推荐

