FTPLIB:socket.error期间/之后LIST // ssl._sslobj.shutdo

2019-07-31 11:02发布

我尝试连接到使用客户端证书FTPS服务器。
我试了2台不同的服务器(在我已经无法控制,但应该是非常相似)。

建立连接和PWD命令成功。
在一台服务器的LIST命令成功,但在第二个,它产生正确的结果(文件列表),但之后会产生错误(显然是在SSL关机)。
在服务器端,他们告诉我:“你的LIST命令正确传递但后来你失去了一个新的SSL重新negociation期间的连接。”
任何想法,为什么?

提前致谢。

常见的命令来建立连接:

# Python 2.7.3rc2 (default, Apr 22 2012, 22:30:17)

>>> import ssl
>>> from ftplib import FTP_TLS

>>> ftps = FTP_TLS(keyfile="/path/to/***.key", certfile="/path/to/***.crt")
>>> ftps.set_debuglevel(2)
>>> ftps.ssl_version = ssl.PROTOCOL_TLSv1
>>> ftps.connect("***", 7806)
*get* '220 Welcome to Synchrony Gateway FTP server\r\n'
*resp* '220 Welcome to Synchrony Gateway FTP server'
'220 Welcome to Synchrony Gateway FTP server'

>>> ftps.auth()
*cmd* 'AUTH TLS'
*put* 'AUTH TLS\r\n'
*get* '234 AUTH command OK, waiting handshake\r\n'
*resp* '234 AUTH command OK, waiting handshake'
'234 AUTH command OK, waiting handshake'

>>> ftps.login("***", "***")
*cmd* 'USER ***'
*put* 'USER ***\r\n'
*get* '331 Send password please\r\n'
*resp* '331 Send password please'
*cmd* 'PASS ************'
*put* 'PASS ************\r\n'
*get* '230 User logged in, proceed\r\n'
*resp* '230 User logged in, proceed'
'230 User logged in, proceed'

>>> ftps.prot_p()
*cmd* 'PBSZ 0'
*put* 'PBSZ 0\r\n'
*get* '200 Command okay\r\n'
*resp* '200 Command okay'
*cmd* 'PROT P'
*put* 'PROT P\r\n'
*get* '200 Command okay\r\n'
*resp* '200 Command okay'
'200 Command okay'

>>> ftps.set_pasv(True)
>>> ftps.pwd()
*cmd* 'PWD'
*put* 'PWD\r\n'
*get* '257 "/" is current directory.\r\n'
*resp* '257 "/" is current directory.'
'/'

失败的LIST命令:

>>> ftps.retrlines("LIST")
*cmd* 'TYPE A'
*put* 'TYPE A\r\n'
*get* '200 Command okay\r\n'
*resp* '200 Command okay'
*cmd* 'PASV'
*put* 'PASV\r\n'
*get* '227 Entering passive mode (212,63,***,**,30,131).\r\n'
*resp* '227 Entering passive mode (212,63,***,**,30,131).'
*cmd* 'LIST'
*put* 'LIST\r\n'
*get* '125 List started\r\n'
*resp* '125 List started'
total 3
dr-xr-xr-x   0 --NA--   --NA--            0 Apr 23 16:46 .
d---------   0 --NA--   --NA--            0 Jun  4 15:02 ..
dr-xr-xr-x   0 --NA--   --NA--            0 Apr 23 16:46 **
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/ftplib.py", line 721, in retrlines
    conn.unwrap()
  File "/usr/lib/python2.7/ssl.py", line 284, in unwrap
    s = self._sslobj.shutdown()
socket.error: [Errno 0] Error

>>> ftps.pwd()
*cmd* 'PWD'
*put* 'PWD\r\n'
*get* '226 List completed\r\n'
*resp* '226 List completed'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/ftplib.py", line 575, in pwd
    return parse257(resp)
  File "/usr/lib/python2.7/ftplib.py", line 839, in parse257
    raise error_reply, resp
ftplib.error_reply: 226 List completed

>>> ftps.quit()
*cmd* 'QUIT'
*put* 'QUIT\r\n'
*get* '257 "/" is current directory.\r\n'
*resp* '257 "/" is current directory.'
'257 "/" is current directory.'

Answer 1:

我们也面临着同样的问题。 里面SSL.PY我们歌厅错误0例外

def unwrap(self):
    if self._sslobj:
        print "SSL Object Present"
        s = self._sslobj.shutdown()
        print "SSL Object Shoutdown"
        print "print s"
        print s
        self._sslobj = None
        return s
    else:
        raise ValueError("No SSL wrapper around " + str(self))

S = self._sslobj.shutdown()这条线上其投掷异常。 你对此有否更新?

我修改了ftplib.py retrline方法与下面的代码

    if isinstance(conn, ssl.SSLSocket):
     conn.close()

它与任何错误的工作。 我不知道影响的这改变了其他功能



文章来源: ftplib: socket.error during/after LIST // ssl._sslobj.shutdown() / connection timed out