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

