GitHub Actions部署EC2实例时ssh-keyscan失败问题求助
GitHub Actions部署EC2时ssh-keyscan失败问题
尝试借助GitHub Actions实现代码向EC2实例的自动化部署,但ssh-keyscan操作在Actions工作流中失败,该操作在本地机器上可正常执行。
工作流文件
name: Deploy on: push: branches: - 'main' env: SERVER_HOST: x.x.x.xx SERVER_USER: username SERVER_PATH: ~/folder-name/ jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Install SSH Key uses: shimataro/ssh-key-action@v2.3.1 with: key: "${{ secrets.SSH_PRIVATE_KEY }}" known_hosts: "just-a-placeholder-so-we-dont-get-errors" - name: Generate auth hosts run: ssh-keyscan -H ${{ env.SERVER_HOST }} >> ~/.ssh/known_hosts # Deploy - run: rsync -rv --delete . ${{ env.SERVER_USER }}@${{ env.SERVER_HOST }}:${{ env.SERVER_PATH }}
备注
- secrets.SSH_PRIVATE_KEY为通过
ssh-keygen -t rsa -b 4096 -C "dummyemail@host.com"生成的OpenSSH私钥,关联触发工作流的GitHub账户邮箱; - 已将对应的公钥添加至服务器的
~/.ssh/authorized_keys文件中。
实际错误
ssh-keyscan: connect to host x.x.x.xx port 22: Connection timed out
解决方案
1. 检查EC2安全组配置
确保EC2实例的安全组入站规则允许22端口访问,来源可添加GitHub Actions官方IP段(可在GitHub Docs查询最新列表),测试阶段可临时允许0.0.0.0/0(生产环境不建议)。
2. 正确配置known_hosts,替换占位符
不要用占位符,直接通过预先生成的服务器公钥配置:
- 本地执行
ssh-keyscan -H x.x.x.xx,将输出内容存入GitHub仓库的Secrets(命名为KNOWN_HOSTS); - 修改工作流中的SSH Key安装步骤:
- name: Install SSH Key uses: shimataro/ssh-key-action@v2.3.1 with: key: "${{ secrets.SSH_PRIVATE_KEY }}" known_hosts: "${{ secrets.KNOWN_HOSTS }}"
此方法可跳过Actions中的ssh-keyscan步骤,规避网络问题。
3. 验证EC2实例网络可达性
- 确认EC2实例拥有公网IP且能通过公网访问;
- 若使用私有IP,需将GitHub Actions的Runner部署在VPC内部(使用Self-hosted Runner)。
4. 检查EC2本地防火墙
登录EC2实例,确认系统防火墙(如ufw、firewalld)已允许22端口的入站流量。
内容的提问来源于stack exchange,提问作者sergeyka
相关产品推荐
相关产品推荐

