问题描述
所以,我正在尝试连接到 FTP 服务器以获取目录列表并下载文件.但是 prot_p() 函数之后的第一个命令引发了异常 - 从日志中产生这些错误:
So, I am trying to connect to an FTP server to get directory listings and download files. But the first command after the prot_p() function is raising an exception - Producing these errors from the log:
*get* '150 Here comes the directory listing. ' *resp* '150 Here comes the directory listing.' *get* '522 SSL connection failed; session reuse required: see require_ssl_reuse option in vsftpd.conf man page ' *resp* '522 SSL connection failed; session reuse required: see require_ssl_reuse option in vsftpd.conf man page' Traceback (most recent call last): File "C: empdownload.py", line 29, in <module> files = ftps.dir() File "C:Python27libftplib.py", line 522, in dir self.retrlines(cmd, func) File "C:Python27libftplib.py", line 725, in retrlines return self.voidresp() File "C:Python27libftplib.py", line 224, in voidresp resp = self.getresp() File "C:Python27libftplib.py", line 219, in getresp raise error_perm, resp ftplib.error_perm: 522 SSL connection failed; session reuse required: see requir e_ssl_reuse option in vsftpd.conf man page
代码如下:
from ftplib import FTP_TLS import os import socket host = 'example.com' port = 34567 user = 'user1' passwd = 'pass123' acct = 'Normal' ftps = FTP_TLS() ftps.set_debuglevel(2) ftps.connect(host, port) print(ftps.getwelcome()) print(ftps.sock) ftps.auth() ftps.login(user, passwd, acct) ftps.set_pasv(True) ftps.prot_p() print('Current directory:') print(ftps.pwd()) files = ftps.dir() ftps.quit()
我想安全地执行此操作,因此使用 FTP over TLS Explicit.我的想法是我可能需要操作 ftplib 引用的 Socket 类中的一些设置.更改服务器上的设置是不可能的.我已经使用 FileZilla 客户端成功测试了服务器,但旧版本的 WinSCP 引发了同样的错误 - 尽管升级到最新版本修复了它.
I want to do this securely, hence using FTP over TLS Explicit. I have the idea that I may need to manipulate some settings in the Socket class referenced by ftplib. Changing the settings on the server is not a possibility. I have tested the server successfully with FileZilla client, an older version of WinSCP was raising the same error - although an upgrade to the newest version fixed it.
有什么想法吗?
推荐答案
现在可以通过这个类(FTP_TLS的后代)轻松修复Python 3.6+:
It can be now easily fixed for Python 3.6+ by this class (descendant of FTP_TLS):
class MyFTP_TLS(ftplib.FTP_TLS): """Explicit FTPS, with shared TLS session""" def ntransfercmd(self, cmd, rest=None): conn, size = ftplib.FTP.ntransfercmd(self, cmd, rest) if self._prot_p: conn = self.context.wrap_socket(conn, server_hostname=self.host, session=self.sock.session) # this is the fix return conn, size