530错误表示FTP登录认证失败,主因是用户名密码错误、账户禁用、主动/被动模式不匹配、IP限制或SSL/TLS配置冲突;需逐项核查凭证、账户状态、连接模式及加密设置。

FTP连接失败:常见错误和认证绕过方式
直接用 ftplib.FTP 连接时,常遇到 530 Login authentication failed 或超时,根本原因通常是服务器启用了 FTPS(隐式/显式 TLS)或被动模式未正确启用。纯 FTP 明文协议在多数现代服务中已被禁用,必须确认目标是否支持 FTP 还是只接受 FTP_TLS。
- 先尝试
FTP_TLS替代FTP,即使端口是 21;调用ftp.login()前必须执行ftp.auth()和ftp.prot_p() - 若报错
425 Can't open data connection,大概率是防火墙或 NAT 阻断了被动模式端口 —— 必须调用ftp.set_pasv(True)(默认值,但某些旧服务器需显式设为True) - 用户名含 @ 符号(如邮箱)时,部分 FTP 服务会解析失败,改用 URL 编码或联系管理员确认认证格式
上传单个文件:二进制模式与路径陷阱
用 storbinary() 上传时,若文件内容乱码或体积异常(比如变小一半),基本是误用了文本模式。FTP 协议不自动转换换行符,所有文件都应以二进制方式传输。
- 打开本地文件必须用
open(..., 'rb'),不能用'r';传给storbinary()的回调函数参数名无关紧要,但数据块必须原样写入 - 远程路径不要以
/开头(除非明确是绝对路径),多数 FTP 服务器工作目录为用户根目录,storbinary('STOR uploads/report.pdf', f)中的uploads/report.pdf是相对路径 - 如果提示
553 Could not create file,检查目标目录是否存在 ——storbinary不会自动创建父目录,需提前用ftp.mkd()或ftp.cwd()确保路径有效
下载文件并避免内存爆满
大文件(>100MB)直接用 retrbinary() 写入内存再保存,容易触发 MemoryError。必须流式写入磁盘,且注意回调函数中每次接收的数据块长度不可预设。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 使用
open(..., 'wb')创建文件句柄,传给retrbinary()的回调函数负责f.write(data),不要拼接字符串或 bytes -
retrbinary()的blocksize参数默认是 8192,对千兆网络可设为65536提升吞吐,但超过 1MB 可能引发部分服务器中断 - 若下载后文件大小为 0,检查回调函数是否被定义但未执行 —— 常见于忘记传入回调(如写成
ftp.retrbinary('RETR x.log', None)),此时命令发出去但无数据接收
主动模式 vs 被动模式:什么时候必须改配置
内网机器上传失败、卡在 LIST 或 RETR 步骤,八成是主动模式(PORT)被路由器拦截。被动模式(PASV)由客户端发起所有连接,兼容性更好,但依赖服务器开放高位端口范围。
立即学习“Python免费学习笔记(深入)”;
- 绝大多数情况坚持用
ftp.set_pasv(True)(默认),仅当服务器明确要求主动模式且你有外网 IP+端口映射权限时,才设为False - 某些企业 FTP 服务器限制 PASV 端口范围(如只开 50000–50100),需用
ftp.sendcmd('PBSZ 0') + ftp.sendcmd('PROT P')配合防火墙策略 - 调用
ftp.dir()或ftp.nlst()前务必确认模式已生效 —— 模式切换不影响已建立的控制连接,但影响后续所有数据通道建立
FTP 协议本身没有原子性保证,上传中途断连不会自动回滚,生产环境必须加 MD5 校验或用 SIZE 命令比对远端文件长度。别指望 ftplib 自动重试 —— 这些都得自己写逻辑兜底。

















