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

Python3使用Paramiko多线程同时建立多个SSH会话报错No existing session

问题解决方法

根因分析

你代码中全局初始化的paramiko.SSHClient()实例被所有线程共享,而paramiko客户端实例不是线程安全的。多线程并发操作同一个SSHClient实例时,会互相覆盖内部的会话状态、传输对象属性,最终导致随机抛出No existing session异常。

修复方案

每个线程内单独创建独立的SSHClient实例即可解决冲突,修改后代码如下:

import paramiko
import threading
import time
threads = []
API_servers =  ["x.x.x.x", "x.x.x.x"]

def connect(server):
    # 线程内部创建专属SSHClient实例
    ssh = paramiko.SSHClient()
    try:
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh.connect(
            server,
            port=22,
            username="root",
            password="x",
            look_for_keys=False,
            allow_agent=False,
            timeout=60
        )
        stdin, stdout, stderr = ssh.exec_command("echo Connected to server! > debug.txt")
        # 等待命令执行完成,避免连接提前断开
        stdout.channel.recv_exit_status()
    except Exception as e:
        print(f"服务器{server}连接/执行失败:{str(e)}")
    finally:
        # 主动关闭连接释放资源
        ssh.close()

for server in API_servers:
    t = threading.Thread(target=connect, args=(server,))
    t.start()
    threads.append(t)
    time.sleep(.4)

for t in threads:
    t.join()

额外优化说明

  • 原代码中timeout参数单位为秒,你设置的6000等同于100分钟无意义,修改为常规的60秒即可。
  • 新增异常捕获逻辑,方便定位单台服务器的连接问题。
  • 新增finally块主动关闭连接,避免SSH连接资源泄露。
  • 新增命令执行等待逻辑,避免SSH连接在命令未落地前就断开,导致文件未生成。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 13:27:03