这个问题在这里已有答案:
我正在尝试连接到FTP站点以下载一些文件:
from ftplib import FTP_TLS
from ftplib import FTP
import ssl
import ftplib
FTP_TLS.ssl_version = ssl.PROTOCOL_TLSv1_2
ftps = FTP_TLS(timeout=100)
ftps.set_debuglevel(2)
ftps.connect('IP', port)
ftps.auth()
ftps.prot_p()
ftps.login('username', 'password')
程序尝试在失败之前的某个时间发生以下错误:
获取''Traceback(最近一次调用最后一次):文件“FTP.py”,第12行,在ftps.connect('IP',端口)文件“C:_data \ learn \ Miniconda \ lib \ ftplib.py”中,行155,在连接self.welcome = self.getresp()文件“C:_data \ learn \ Miniconda \ lib \ ftplib.py”,第236行,在getresp中resp = self.getmultiline()文件“C:_data \ learn \ Miniconda \ lib \ ftplib.py“,第222行,在getmultiline行= self.getline()文件”C:_data \ learn \ Miniconda \ lib \ ftplib.py“,第210行,在getline中引发EOFError EOFError
我不确定这个错误的原因是什么。我可以使用与FTP客户端(FileZilla)相同的详细信息连接到ftp服务器。任何人都可以指出我的代码是否存在问题以及解决此问题的可能选项。
编辑1
如下所示发布FileZilla日志:
Status: Connecting to IP:Port... Status: Connection established, initializing TLS... Status: Verifying certificate... Status: TLS connection established, waiting for welcome message... Status: Logged in Status: Retrieving directory listing... Status: Directory listing of "/" successful
FIleZilla显式弹出一个证书,我在桌面上按OK,然后建立连接。我假设这里的失败是因为我的代码不接受证书。任何帮助表示赞赏。
对于任何寻找答案的人来说,问题是隐式FTPS连接需要套接字自动包装ssl。我使用George Leslie-Waksman编写的下面一段代码
import ftplib
import ssl
class ImplicitFTP_TLS(ftplib.FTP_TLS):
"""FTP_TLS subclass that automatically wraps sockets in SSL to support implicit FTPS."""
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._sock = None
@property
def sock(self):
"""Return the socket."""
return self._sock
@sock.setter
def sock(self, value):
"""When modifying the socket, ensure that it is ssl wrapped."""
if value is not None and not isinstance(value, ssl.SSLSocket):
value = self.context.wrap_socket(value)
self._sock = value
如果这可以解决您的问题,那么请原始答案 - > https://stackoverflow.com/a/36049814/392233