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配置文件
可能的原因及解决办法
本地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)
- 在SSH命令中添加连接复用参数:
目标域名DNS解析异常
虽前5次正常,但本地DNS缓存或解析服务对该域名的请求可能存在次数限制,第6次请求时解析延迟或失败,导致连接超时。
解决:- 将sub1.domain.io的IP映射到本地
hosts文件,跳过DNS解析环节 - 更换本地DNS服务器(如8.8.8.8或114.114.114.114)
- 将sub1.domain.io的IP映射到本地
本地防火墙/安全软件拦截
部分安全软件或防火墙会监控并发连接数,当同一目标的连接数达到阈值(如5个)时,会自动拦截后续连接请求。
解决:- 临时关闭本地防火墙或安全软件测试,确认是否为其导致
- 在防火墙规则中添加允许该域名多连接的放行规则
SSH参数导致的会话资源限制
脚本中使用了-t参数强制分配伪终端,每次连接都会创建一个终端会话,部分服务器或本地系统对终端会话数量有限制。
解决:- 若执行的命令无需交互,去掉
-t参数,减少会话资源占用
- 若执行的命令无需交互,去掉
内容的提问来源于stack exchange,提问作者Kyle H
相关产品推荐
相关产品推荐

