我正在尝试连接以连接到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')
程序在失败之前会尝试一段时间,并显示以下错误:
获取'' 回溯(最近一次通话):文件“ FTP.py”,第12行,在 ftps.connect('IP',port)连接中的文件“ C:_data \ learn \ Miniconda \ lib \ ftplib.py”,第155行 self.welcome = self.getresp()getresp中的第236行“ C:_data \ learn \ Miniconda \ lib \ ftplib.py” resp = self.getmultiline()文件“ C:_data \ learn \ Miniconda \ lib \ ftplib.py”,行222,在getmultiline中 line = self.getline()在getline中的第210行,文件“ C:_data \ learn \ Miniconda \ lib \ ftplib.py” 引发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。我认为这里的失败是因为我的代码不接受证书。任何帮助表示赞赏。
答案 0 :(得分:0)
对于任何寻求答案的人来说,问题是隐式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