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

使用Python的pysftp串行下载50+个SFTP文件时提示Authentication failed如何解决?

问题诱因
  • 服务端认证频率限制:当前代码每次循环都会新建一个SFTP连接,每次下载都需要走完整的SSH认证流程,短时间内高频发起的认证请求会触发SFTP服务端的防爆破安全策略(绝大多数SSH服务端默认都会配置单位时间内同一IP的最大认证次数,也可能搭配fail2ban等安全工具),超过阈值后服务端会临时拒绝认证请求,返回认证失败错误,这是偶发异常的核心原因。
  • 网络波动:认证握手阶段出现临时丢包、延迟过高,导致认证数据包未完整交互,也会被判定为认证失败。
  • 服务端连接数超限:短时间新建大量连接超出服务端单IP最大连接数限制,同样会触发认证失败类报错。
修复方案
  • 核心优化:复用同一个SFTP连接,将连接初始化逻辑移到for循环外部,全程只做1次认证,从根源避免高频认证的问题,修正后代码如下:
import pysftp
import pandas as pd
import os

# 连接初始化仅执行1次,全局复用
with pysftp.Connection(HOSTNAME, username=USERNAME, password=PASSWORD) as sftp:
    for remote_path in list_of_stfp_paths:
        sftp.get(remote_path, str(local_path))
        # 原CSV校验、删除逻辑保持不变
        df = pd.read_csv(str(local_path))
        print(df['taken_time'].value_counts())
        os.remove(str(local_path))
  • 增加异常重试机制:针对认证失败异常添加指数退避重试逻辑,建议最多重试3次,每次间隔2~5秒,覆盖偶发网络波动、临时服务端限制的场景。
  • 特殊场景适配:如果业务逻辑必须每次新建连接,可以在两次连接建立之间添加3秒以上的等待时间,避开服务端的频率限制阈值。
  • 可选优化:使用SSH密钥认证替代密码认证,认证成功率更高,也能降低密码认证被服务端安全策略拦截的概率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 11:54:03