能否通过YAML配置借助Jumphost实现GitHub Action SSH登录VM?
可以借助YAML配置实现GitHub Action通过Jumphost SSH登录生产服务器
当然可以实现,下面是具体的配置方案和执行细节:
前置准备
先在GitHub仓库的Settings > Secrets and variables > Actions中添加以下敏感信息(避免硬编码在YAML里):
JUMPHOST_SSH_KEY:登录Jumphost的私钥PROD_SERVER_SSH_KEY:登录生产服务器的私钥JUMPHOST_USER:Jumphost的登录用户名JUMPHOST_IP:Jumphost的公网IP地址PROD_SERVER_USER:生产服务器的登录用户名PROD_SERVER_IP:生产服务器的内网/目标IP
完整YAML配置示例
name: SSH to Prod via Jumphost on: [push, workflow_dispatch] jobs: deploy: runs-on: ubuntu-latest steps: - name: Configure SSH environment run: | # 创建SSH目录并设置权限 mkdir -p ~/.ssh chmod 700 ~/.ssh # 写入Jumphost和生产服务器的私钥 echo "${{ secrets.JUMPHOST_SSH_KEY }}" > ~/.ssh/jump_key echo "${{ secrets.PROD_SERVER_SSH_KEY }}" > ~/.ssh/prod_key chmod 600 ~/.ssh/jump_key ~/.ssh/prod_key # 配置SSH config,简化跳转命令 cat > ~/.ssh/config << EOF Host jump-host User ${{ secrets.JUMPHOST_USER }} HostName ${{ secrets.JUMPHOST_IP }} IdentityFile ~/.ssh/jump_key StrictHostKeyChecking no Host prod-server User ${{ secrets.PROD_SERVER_USER }} HostName ${{ secrets.PROD_SERVER_IP }} IdentityFile ~/.ssh/prod_key ProxyCommand ssh -W %h:%p jump-host StrictHostKeyChecking no EOF chmod 600 ~/.ssh/config - name: Run command on production server run: ssh prod-server "echo '✅ Successfully logged into production server' && uptime && free -h"
配置说明
- SSH Config文件:通过定义
jump-host和prod-server两个主机条目,其中ProxyCommand ssh -W %h:%p jump-host指定了通过Jumphost转发SSH请求到生产服务器,后续直接用ssh prod-server就能完成跳转。 - 权限设置:SSH对文件权限要求严格,私钥和配置文件必须设为
600,目录设为700,否则会拒绝访问。 - StrictHostKeyChecking:关闭主机密钥验证是为了适配CI/CD场景(如果需要更高安全性,可以预先将Jumphost和生产服务器的公钥添加到
known_hosts中)。
简化版(无需SSH Config)
如果不想配置SSH文件,也可以直接在命令中指定代理参数:
name: Direct SSH via Jumphost on: [workflow_dispatch] jobs: ssh-test: runs-on: ubuntu-latest steps: - name: Direct SSH to prod run: | mkdir -p ~/.ssh echo "${{ secrets.JUMPHOST_SSH_KEY }}" > ~/.ssh/jump_key echo "${{ secrets.PROD_SERVER_SSH_KEY }}" > ~/.ssh/prod_key chmod 600 ~/.ssh/jump_key ~/.ssh/prod_key # 直接通过ProxyCommand跳转 ssh -i ~/.ssh/prod_key \ -o ProxyCommand="ssh -i ~/.ssh/jump_key -W %h:%p ${{ secrets.JUMPHOST_USER }}@${{ secrets.JUMPHOST_IP }}" \ ${{ secrets.PROD_SERVER_USER }}@${{ secrets.PROD_SERVER_IP }} \ "echo '✅ Connected to production server' && df -h"
内容的提问来源于stack exchange,提问作者Franky
相关产品推荐
相关产品推荐

