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
相关产品推荐
相关产品推荐

