使用空凭据登录时ftputil报530错误但ftplib可正常连接
ftputil空凭据连接FTP报错530的解决方法
问题描述
使用ftplib以空用户名和密码连接ftp.swpc.noaa.gov可以正常工作,但使用ftputil相同凭据时,出现错误:
ftputil.error.PermanentError: 530 Please login with USER and PASS.
原因分析
ftputil的FTPHost构造函数在处理空用户名时,会默认将用户名替换为anonymous,并自动生成类似user@example.com的默认密码作为匿名登录凭据。但部分FTP服务器(如目标服务器)仅接受空凭据登录,不识别这种匿名用户默认值,因此触发认证错误。
解决方案
绕过ftputil的默认登录逻辑,先通过ftplib完成空凭据登录,再将已认证的ftplib实例传给ftputil使用:
import ftputil import ftplib host = 'ftp.swpc.noaa.gov' user = '' pw = '' # 用ftplib完成空凭据登录 ftp_client = ftplib.FTP(host) ftp_client.login(user, pw) # 复用已登录的连接初始化FTPHost with ftputil.FTPHost(None, None, None, ftp_client=ftp_client) as ftphost: # 测试ftputil功能,列出当前目录内容 print(ftphost.listdir(ftphost.curdir))
说明
这种方式让ftputil直接使用已完成认证的ftplib连接,避免了其自动替换空凭据为匿名用户信息的逻辑,从而适配仅接受空凭据的FTP服务器。
内容的提问来源于stack exchange,提问作者cap
相关产品推荐
相关产品推荐

