使用Python ftplib连接22端口FTP服务器出现EOFError报错如何解决
报错成因
- 核心为协议不匹配:你使用的Python标准库
ftplib.FTP仅支持FTP/FTPS协议,但目标服务为SFTP(SSH文件传输协议):你使用的连接端口是22(SFTP默认端口),域名前缀也明确标注是sftp,两种协议底层实现完全不兼容,ftplib无法解析SFTP服务返回的握手数据,连接被服务端断开后就会抛出EOFError。 - WinSCP可以正常连接的原因是它本身同时兼容FTP、SFTP等多种文件传输协议,你在WinSCP的连接配置中默认选择了SFTP协议,和你代码中使用的FTP协议不一致。
修复方案
你需要使用支持SFTP协议的Python库完成上传,推荐使用封装简洁的pysftp(基于paramiko开发),操作步骤如下:
- 安装依赖库
pip install pysftp
- 替换原有代码为SFTP实现,参考代码如下:
import os import pysftp host = "sftp.xx.com" username = "username" password = "passwrd" # Windows路径建议加r前缀避免转义问题 local_file = r"C:\sample.csv" remote_target_dir = "/content/remotedir" # 测试环境可关闭主机密钥校验,生产环境建议配置known_hosts提升安全性 cn_options = pysftp.CnOpts() cn_options.hostkeys = None # 自动管理连接无需手动关闭 with pysftp.Connection( host=host, port=22, username=username, password=password, cnopts=cn_options ) as sftp: # 切换到远程目标目录 sftp.cwd(remote_target_dir) # 上传本地文件到远程目录 sftp.put(local_file, os.path.basename(local_file)) # 打印目录内容验证上传结果 print("远程目录文件列表:", sftp.listdir())
额外注意事项
- Windows系统下的文件路径如果使用反斜杠
\,需要给字符串加r前缀,否则\开头的字符会被识别为转义符,导致文件找不到报错。 - 生产环境使用SFTP建议保留主机密钥校验,避免中间人攻击风险,不要直接关闭hostkeys检查。
内容的提问来源于stack exchange,提问作者user739115
相关产品推荐
相关产品推荐

