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

SSH命令前5次正常执行,第6次持续超时的原因排查

SSH脚本执行第6次时持续连接超时问题

问题描述

我编写了如下Python脚本用于执行SSH命令:

def run_ssh_cmd(host, cmd):
    global i
    i += 1
    ql(f"Running cmd {i}: {cmd}", "info", host)

    cmds = ["ssh", "-t", "-p", "22", host, cmd]
    process = Popen(cmds, stdout=PIPE, stderr=PIPE, stdin=PIPE)
    stdout, stderr = process.communicate()

    # Check if the command was successful
    if process.returncode != 0:
        ql(f"Error occurred on cmd {cmd}: {stderr}", "error", host)
        raise CalledProcessError(process.returncode, cmds, stderr)

在我的PC上运行该脚本时,每次执行到第6条命令都会触发超时错误,错误信息为:

ssh: connect to host sub1.domain.io port 22: Connection timed out

已完成的排查

  • 可正常SSH连接目标域名,前5次命令执行无异常
  • 同事运行该脚本无任何问题
  • 在其他域名的服务器上执行该命令无异常,仅针对domain.io的子域名出现此问题
  • 无论执行何种命令,均是前5次正常,第6次超时
  • 检查服务器端SSH日志未发现异常
  • 本地无.ssh\config配置文件

可能的原因及解决办法

  1. 本地TCP连接数限制
    大部分系统默认对单个目标IP的并发TCP连接数有上限(常见为5个),脚本每次新建SSH连接,前5次占满可用连接槽后,第6次时系统还未释放处于TIME_WAIT状态的旧连接,导致无法建立新连接。
    解决:

    • 在SSH命令中添加连接复用参数:-o ControlMaster=auto -o ControlPath=/tmp/ssh-%r@%h:%p -o ControlPersist=60s,复用已有连接而非每次新建
    • 调整本地系统TIME_WAIT相关参数,加快连接释放(Linux可修改net.ipv4.tcp_tw_reuse和net.ipv4.tcp_tw_recycle;Windows可调整TcpTimedWaitDelay)
  2. 目标域名DNS解析异常
    虽前5次正常,但本地DNS缓存或解析服务对该域名的请求可能存在次数限制,第6次请求时解析延迟或失败,导致连接超时。
    解决:

    • 将sub1.domain.io的IP映射到本地hosts文件,跳过DNS解析环节
    • 更换本地DNS服务器(如8.8.8.8或114.114.114.114)
  3. 本地防火墙/安全软件拦截
    部分安全软件或防火墙会监控并发连接数,当同一目标的连接数达到阈值(如5个)时,会自动拦截后续连接请求。
    解决:

    • 临时关闭本地防火墙或安全软件测试,确认是否为其导致
    • 在防火墙规则中添加允许该域名多连接的放行规则
  4. SSH参数导致的会话资源限制
    脚本中使用了-t参数强制分配伪终端,每次连接都会创建一个终端会话,部分服务器或本地系统对终端会话数量有限制。
    解决:

    • 若执行的命令无需交互,去掉-t参数,减少会话资源占用

内容的提问来源于stack exchange,提问作者Kyle H

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 10:33:15