使用python ftplib违反协议发生了EOF

时间:2015-12-07 09:40:51

标签: python python-2.7

我正在使用python ftplib进行隐式tls连接程序。我尝试了问题python-ftp-implicit-tls-connection-issue中提供的解决方案(包括Rg Glpj和Juan Moreno的答案)来建立连接。但是当我像这样登录到ftp服务器后调用retrlineretrbinary时(FTP_ITLSFTP_TLS的子类):

58 server = FTP_ITLS()
59 server.connect(host="x.x.x.x", port=990)
60 server.login(user="user", passwd="******")
61 server.prot_p()
62
63 server.cwd("doc")
64 print(server.retrlines('LIST'))
65 # server.retrbinary('RETR contents.7z', open('contents.7z', 'wb').write)
66 server.quit()

我收到了EOF错误:

Traceback (most recent call last):
  File "D:/Coding/test/itls.py", line 64, in <module>
    print(server.retrlines('LIST'))
  File "D:\Python\Python27\lib\ftplib.py", line 735, in retrlines
    conn = self.transfercmd(cmd)
  File "D:\Python\Python27\lib\ftplib.py", line 376, in transfercmd
    return self.ntransfercmd(cmd, rest)[0]
  File "D:\Python\Python27\lib\ftplib.py", line 713, in ntransfercmd
    server_hostname=self.host)
  File "D:\Python\Python27\lib\ssl.py", line 352, in wrap_socket
    _context=self)
  File "D:\Python\Python27\lib\ssl.py", line 579, in __init__
    self.do_handshake()
  File "D:\Python\Python27\lib\ssl.py", line 808, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLEOFError: EOF occurred in violation of protocol (_ssl.c:590)

因为似乎ftplib使用PROTOCOL_SSLv23作为Python 2.7中的默认协议,我试过了 PROTOCOL_TLSv1,PROTOCOL_TLSv1_1和PROTOCOL_TLSv1_2,但它们都没有奏效。我还试图覆盖ntransfercmdauth,或者设置ctx = ssl._create_stdlib_context(ssl.PROTOCOL_TLSv1),正如Steffen Ullrich在问题connect-to-ftp-tls-1-2-server-with-ftplib中所说的那样,但错误从未消失过。那我该怎么办?感谢。

1 个答案:

答案 0 :(得分:2)

我试图连接到FileZilla FTP服务器。 FileZilla在“FTP over TLS设置”中有一个设置,称为“使用PROT P时需要在数据连接时恢复TLS会话”。禁用此选项可解决此问题。

如果您无法控制服务器,请查看FTPES - Session Reuse Required,了解如何启用会话重用。但这似乎需要Python 3.6+。