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

循环处理SFTP文件时运行19条后遇paramiko SSHException错误求助

问题根源

短时间内频繁创建SSH/SFTP连接,触发了服务器的连接次数限制,导致连接被重置。原代码每处理一条记录就新建一次连接,19次后达到服务器阈值,抛出SSHException。


解决方案

1. 核心优化:复用SSH连接

只创建一次SSH连接,在循环中复用该连接完成所有下载操作,大幅减少连接请求次数,避免触发服务器限制。

2. 修复其他潜在问题

  • 日志写入从覆盖模式(w)改为追加模式(a),保留所有失败记录
  • 自动创建本地存储目录,避免因目录不存在报错
  • 细化异常捕获,便于排查具体错误
  • 确保连接最终关闭,避免资源泄漏

修改后的完整代码

import paramiko
import os
import time 

lsit1 = ["CBCGG1900089HM", "CBCGG1900090HM", "CBCGG1900091HM", "CBCGG1900092HM", "CBCGG1900093HM", "CBCGG1900094HM", "CBCGG1900095HM", "CBCGG1900096HM", "CBCGG1900097HM", "CBCGG1900098HM", "CBCGG1900099HM", "CBCGG1900100", "CBCGG1900101HM", "CBCGG1900102HM", "CBCGG1900103HM", "CBCGG1900104HM", "CBCGG1900105HM", "CBCGG1900106HM", "CBCGG1900108HM", "CBCGG1900109HM", "CBCGG1900112HM", "CBCGG1900116HM", "CBCGG1900120HM", "CBCGG1900124HM", "CBCGG1900128HM", "CBCGG1900130HM", "CBCGG1900131HM", "CBCGG1900132HM", "CBCGG1900136HM", "CBCGG1900142HM", "CBCGG1900149HM", "CBCGG1900151HM", "CBCGG1900153", "CBCGG1900161", "CBDGG1900001", "BCYG1800038", "BCYG1800041", "BCYG1800045", "BCYG1800047", "BCYG1800049"]
col_id = []

def sftp_download(ftp, item):
    try:
        # 创建本地存储目录
        local_dir = f'/home/hvr/sftp_python/Optima660_Beijing {item}'
        if not os.path.exists(local_dir):
            os.makedirs(local_dir)
        # 执行下载
        remote_path = f'/CT_Logs/Optima660_Beijing/{item}/image_analysis.csv'
        local_path = f'{local_dir}/image_analysis.csv'
        ftp.get(remote_path, local_path)
        print(f"{item} 下载完成")
    except Exception as e:
        error_msg = f"{item} 下载失败: {str(e)}"
        print(error_msg)
        col_id.append(f"Optima660_Beijing/{item}")
        # 追加写入日志
        with open("/home/hvr/sftp_python/logs/sftp_logs.txt", 'a') as f:
            f.write(f"{error_msg}\n")

# 主逻辑:建立一次连接,批量下载
try:
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(hostname='abc.com', timeout=6000, username='abc', password='xxbb')
    ftp = ssh.open_sftp()
    print("SFTP连接已建立")

    for idx, item in enumerate(lsit1):
        sftp_download(ftp, item)
        # 每15次下载后休眠,降低服务器压力
        if idx % 15 == 0 and idx != 0:
            time.sleep(15)

finally:
    # 确保连接最终关闭
    if 'ftp' in locals():
        ftp.close()
    if 'ssh' in locals():
        ssh.close()
    # 写入最终失败列表
    if col_id:
        with open("/home/hvr/sftp_python/logs/sftp_logs.txt", 'a') as f:
            f.write("\n下载失败的记录列表:\n")
            f.write("\n".join(col_id))

额外优化建议

  • 如果服务器限制单连接的操作次数,可以每20-30次下载后重新建立一次连接
  • 增加重试机制,对偶尔的网络波动或服务器繁忙进行自动重试
  • 根据服务器实际情况调整休眠时间,避免操作过于密集

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 08:24:53