python - 即使使用 FTP_TLS,Python ftplib 也会因“策略需要 SSL”而失败
问题描述
我正在尝试使用ftplib
连接到 FTP 服务器来下载一组文件。当我尝试创建连接时,我不断收到534 Policy requires SSL
错误消息。
代码:
from ftplib import FTP_TLS
import pandas
ftp = FTP_TLS(host="ftp._____.com", user="____", passwd="____")
ftp.login(user="______", passwd="______")
ftp.cwd("DIR/")
ftp.dir()
错误日志:
*cmd* 'USER ********'
*put* 'USER ********\r\n'
*get* '331 Password required\n'
*resp* '331 Password required'
*cmd* 'PASS ********'
*put* 'PASS ********\r\n'
*get* '230 User logged in.\n'
*resp* '230 User logged in.'
*cmd* 'CWD ______/'
*put* 'CWD ______/\r\n'
*get* '250 CWD command successful.\n'
*resp* '250 CWD command successful.'
*cmd* 'TYPE A'
*put* 'TYPE A\r\n'
*get* '200 Type set to A.\n'
*resp* '200 Type set to A.'
*cmd* 'PASV'
*put* 'PASV\r\n'
*get* '227 Entering Passive Mode (13,64,237,64,19,157).\n'
*resp* '227 Entering Passive Mode (13,64,237,64,19,157).'
*cmd* 'LIST'
*put* 'LIST\r\n'
*get* '534 Policy requires SSL.\n'
*resp* '534 Policy requires SSL.'
Traceback (most recent call last):
File "xb_shipped.py", line 20, in <module>
ftp.dir()
File "C:\Users\main\AppData\Local\Programs\Python\Python38-32\lib\ftplib.py", line 558, in dir
self.retrlines(cmd, func)
File "C:\Users\main\AppData\Local\Programs\Python\Python38-32\lib\ftplib.py", line 451, in retrlines
with self.transfercmd(cmd) as conn, \
File "C:\Users\main\AppData\Local\Programs\Python\Python38-32\lib\ftplib.py", line 382, in transfercmd
return self.ntransfercmd(cmd, rest)[0]
File "C:\Users\main\AppData\Local\Programs\Python\Python38-32\lib\ftplib.py", line 781, in ntransfercmd
conn, size = FTP.ntransfercmd(self, cmd, rest)
File "C:\Users\main\AppData\Local\Programs\Python\Python38-32\lib\ftplib.py", line 348, in ntransfercmd
resp = self.sendcmd(cmd)
File "C:\Users\main\AppData\Local\Programs\Python\Python38-32\lib\ftplib.py", line 275, in sendcmd
return self.getresp()
File "C:\Users\main\AppData\Local\Programs\Python\Python38-32\lib\ftplib.py", line 248, in getresp
raise error_perm(resp)
ftplib.error_perm: 534 Policy requires SSL.
我也尝试使用此处找到的解决方案:https ://stackoverflow.com/questions/55814722/cannot-list-ftp-directory-using-ftplib-but-ftp-client-works/55874794#55874794
但是这个解决方案给了我同样的错误:
代码:
from ftplib import FTP_TLS
import pandas
class SmartFTP(FTP_TLS):
def makepasv(self):
invalidhost, port = super(SmartFTP, self).makepasv()
return self.host, port
ftp_server = 'ftp.____.com'
ftp = SmartFTP(ftp_server)
ftp.login(user="____", passwd="____")
ftp.cwd("DIR/")
ftp.dir()
解决方案
您必须调用FTP_TLS.prot_p
以在数据通道上启用 TLS/SSL 加密:
ftp = FTP_TLS(ftp_server)
ftp.login(user=...user, passwd=passwd)
ftp.prot_p()
推荐阅读
- python - 是否存在应该明确跟踪或忽略的事件?
- node.js - Mongoose finding entry in sub document, with multiple fields?
- python - 比 for 循环更快的迭代
- xml - 使用 Google 脚本解析 XML 时出现 getChild 问题
- centos7 - 在 centos 上安装 32 位和 64 位 mysql-connector-odbc
- amazon-web-services - 不使用 Cognito 的 AWS API 网关身份验证
- ios - 使用 CameraRoll.saveToCameraRoll 将图像保存到相册?
- c++ - 从弱指针返回类型返回共享指针
- java - 在包含 2 个指定顶点的无向图中查找最短循环
- java - 如何从列表中获取字段,并给出一些输入