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

使用pysftp读取SFTP服务器文件报错OSError: Bad message如何解决

问题解决方案

你遇到的OSError: Bad message错误本质是SFTP协议层交互异常,由路径格式错误直接导致,排查点和修复方案如下:

核心问题排查

  • 路径分隔符使用错误:SFTP服务端统一使用UNIX规范的正斜杠/ 作为路径分隔符,你代码中使用了Windows体系的反斜杠\,服务端无法识别路径就会抛出协议错误。
  • 远程路径拼接方式错误:os.path.join是适配本地操作系统路径规则的工具,如果你本地运行环境是Windows,拼接出来的远程路径依然会携带反斜杠,无法被SFTP服务端解析。
  • 路径逻辑冗余:你已经通过sftp.chdir(remoteFilePath)切换到了目标远程目录,后续操作直接传入文件名即可,不需要再拼接上层目录路径,重复拼接反而容易触发路径错误。
  • 冗余的连接关闭逻辑:你使用了with上下文管理器管理SFTP连接,上下文退出时会自动释放连接,不需要在异常分支手动调用sftp.close()。
  • 代码缺失pysftp导入声明,直接运行会触发导入错误。

修复后代码

import os
import pysftp
from six import BytesIO
import base64

myUsername = "a123"
myPassword = "124qwe"
myHostname = "abc.com"
cnopts = pysftp.CnOpts()
# 注意:关闭主机密钥校验存在安全风险,生产环境建议配置已知主机密钥
cnopts.hostkeys = None

with pysftp.Connection(host=myHostname, username=myUsername,password=myPassword,cnopts=cnopts) as sftp:
    print("Connection succesfully stablished ... ")
    # 替换为UNIX格式的正斜杠路径
    remoteFilePath = "/GLOBAL/test/c1a0604437be43598a0dfe7ddef5b992_1"
    sftp.chdir(remoteFilePath)
    # 直接获取排序后的最新文件名
    filename_list = sorted(sftp.listdir_attr(), key=lambda k: k.st_mtime, reverse=True)
    latest_file = filename_list[0].filename
    try:
        # 已经在目标目录下,直接传文件名即可
        print(sftp.stat(latest_file))
        flo = BytesIO()
        sftp.getfo(latest_file, flo)
        flo.seek(0)
        encoded_img_data = base64.b64encode(flo.getvalue())
        img_data=encoded_img_data.decode('utf-8')
        print("done")
    except FileNotFoundError:
        print("not done")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 08:18:01