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

GitLab CI/CD通过SSH连接远程服务器遇Operation timed out错误

解决GitLab CI执行SSH命令超时问题

排查方向及解决方案

1. 网络连通性验证

本地能正常SSH不代表GitLab Runner所在服务器能连通目标主机,先确认Runner的网络权限:

  • 在Runner服务器(或临时在CI脚本里添加测试命令)执行:
    ping $SERVER_IP
    telnet $SERVER_IP $SERVER_PORT
    
  • 如果测试失败,说明二者之间存在防火墙/安全组拦截:
    • 检查目标服务器的安全组规则,开放GitLab Runner服务器IP对$SERVER_PORT的访问权限;
    • 确认Runner所在网络的出口策略没有封禁目标服务器的IP和端口。

2. CI环境密钥配置检查

  • 验证ID_RSA变量是否完整传递:在before_script中临时添加打印(测试后删除,避免密钥泄露):
    cat "${ID_RSA}"
    
  • 确认密钥已成功添加到ssh-agent:在before_script中添加:
    ssh-add -l
    
  • 脚本中script阶段无需再次指定-i $ID_RSA,因为before_script已经通过ssh-add加载了密钥,重复指定可能引发权限问题。

3. CI变量正确性校验

  • 先打印变量值确认配置无误,在script开头添加:
    echo "目标服务器信息:$SERVER_USER@$SERVER_IP:$SERVER_PORT"
    
  • 检查SERVER_PORT是否为数字格式,SERVER_IP是否为正确的公网/内网IP,避免拼写错误。

4. 主机密钥校验冲突处理

你在before_script中已配置SSH_KNOWN_HOSTS,但script的SSH命令又加了-o StrictHostKeyChecking=no,二者无需混用:

  • 若使用SSH_KNOWN_HOSTS,确保变量内容是目标主机的正确公钥指纹,可删除SSH命令中的-o StrictHostKeyChecking=no;
  • 若仅用于测试,可保留-o StrictHostKeyChecking=no,并删除before_script中关于SSH_KNOWN_HOSTS的配置。

优化后的.gitlab-ci.yml示例

deploy:
  image: alpine:latest
  stage: deploy
  tags:
    - deployment
  before_script:
    - 'command -v ssh-agent >/dev/null || ( apk add --update openssh )'
    - eval $(ssh-agent -s)
    - cat "${ID_RSA}" | tr -d '\r' | ssh-add - > /dev/null 2>&1
    - ssh-add -l  # 验证密钥加载状态
    - mkdir -p ~/.ssh
    - chmod 700 ~/.ssh
    - echo "$SSH_KNOWN_HOSTS" >> ~/.ssh/known_hosts
    - chmod 644 ~/.ssh/known_hosts
    - apk update && apk add openssh-client
  script:
    - echo "目标服务器信息:$SERVER_USER@$SERVER_IP:$SERVER_PORT"
    - ssh -p $SERVER_PORT $SERVER_USER@$SERVER_IP "echo $SERVER_IP"

内容的提问来源于stack exchange,提问作者David Hall

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 05:32:39