使用Python ftplib库连接FTP服务器时密码中的转义字符如何传递?
误解澄清:反斜杠加倍是调试显示问题
你在调试器里看到的双反斜杠是Python展示字符串repr形式时的正常转义,实际存储和发送的字符串只包含1个反斜杠,无需额外处理。你可以直接执行print(pwd)验证实际输出,和你的原始密码一致。你尝试的原生字符串、格式化写法都不会改变这一行为,也不需要额外做这些处理。
报错根因:FTP_TLS 认证顺序和服务器不匹配
从你提供的日志可以看出:
- FileZilla发送
AUTH TLS收到530错误后,自动降级为普通FTP连接,先发送USER和PASS完成登录,后续正常使用 - 而ftplib的
FTP_TLS类默认会在执行login()方法时,先发起AUTH TLS请求再发送账号密码,刚好你的vsFTPd服务端配置要求必须先登录才能执行AUTH命令,所以直接抛出530错误。
解决方案
方案1:使用普通FTP类(和FileZilla降级后逻辑一致)
如果你的场景不需要加密传输,直接替换FTP_TLS为普通FTP类即可,代码如下:
from ftplib import FTP addr = '192.168.1.23' usr = 'ftpuser' pwd = '3Hc]85}Lxqy\\%I+bc1(T' ftp = FTP() ftp.set_debuglevel(2) ftp.connect(host=addr, port=21) ftp.login(user=usr, passwd=pwd)
方案2:保留FTP_TLS,调整认证顺序
如果后续需要升级到TLS加密,可以先手动发送账号密码完成登录,再发起TLS认证:
from ftplib import FTP_TLS addr = '192.168.1.23' usr = 'ftpuser' pwd = '3Hc]85}Lxqy\\%I+bc1(T' ftp = FTP_TLS() ftp.set_debuglevel(2) ftp.connect(host=addr, port=21) # 手动完成登录,跳过login方法默认的提前auth逻辑 ftp.sendcmd(f'USER {usr}') ftp.sendcmd(f'PASS {pwd}') # 若需要加密传输,登录后再执行TLS升级 # ftp.auth() # ftp.prot_p()
内容的提问来源于stack exchange,提问作者Julien Garcia
相关产品推荐
相关产品推荐

