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

GitLab CI/CD SSH连接EC2实例后命令未执行求助

解决GitLab CI/CD SSH连接后命令未执行的问题

你的问题出在SSH命令的执行方式上:当前脚本里的ssh命令是交互式登录到EC2实例,执行后会停留在远程主机的shell会话中,CI/CD Runner会一直等待这个会话结束(但你没有手动退出),导致后续的pwd、ls命令根本没机会执行(而且这两个命令原本是要在远程主机跑的,但写法上是在本地Runner执行,位置也错了)。

修复方案

你需要让SSH直接在远程主机执行指定命令,执行完成后自动退出会话,而不是进入交互式模式。有两种常用写法:

写法1:直接在SSH命令后追加要执行的命令

适合少量单条/串联命令:

image: buildtime_base_v2:3.25.1

stages:
  - test

test:
  stage: test
  script:
    - |
      echo "$SSH_KEY_VARIABLE" > ssh_key.pem
      chmod 600 ssh_key.pem
      # 把要执行的远程命令放在ssh命令末尾,用引号包裹
      ssh -i "ssh_key.pem" -o StrictHostKeyChecking=no centos@<ip> "pwd && ls -l /etc/gitlab"

写法2:使用Here Document执行多条命令

适合需要执行多个独立命令的场景:

image: buildtime_base_v2:3.25.1

stages:
  - test

test:
  stage: test
  script:
    - |
      echo "$SSH_KEY_VARIABLE" > ssh_key.pem
      chmod 600 ssh_key.pem
      # 通过Here Document传递多行命令到远程主机执行
      ssh -i "ssh_key.pem" -o StrictHostKeyChecking=no centos@<ip> << 'EOF'
      pwd
      ls -l /etc/gitlab
      # 在这里添加你需要执行的rake命令
      EOF

关键说明

  • 去掉了-t -t参数:这个参数是强制分配伪终端,用于交互式会话,非交互式执行命令时不需要,反而可能导致不必要的卡顿。
  • 所有需要在远程主机执行的命令,都要放在SSH命令的范围内(要么末尾引号里,要么Here Document块内),这样才会在EC2实例上运行,而不是在本地CI Runner上。

内容的提问来源于stack exchange,提问作者gangadhar r

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 16:30:04