python - ftplib: socket.error during/after LIST//ssl._sslobj.shutdown()/连接超时

标签 python python-2.7 ftplib

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

连接建立,PWD指令成功。
在一台服务器上,LIST 命令成功,但在第二台服务器上,它产生正确的结果(文件列表)但之后(显然在 SSL 关闭期间)产生错误。
在服务器端,他们告诉我:“你的 LIST 命令正确传递,但之后你在新的 SSL 重新协商期间失去了连接。”
知道为什么吗?

提前致谢。

.

建立连接的常用命令:

# 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.'

最佳答案

我们也面临同样的问题。在 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()

它的工作没有任何错误。我不知道此更改对其他功能的影响

关于python - ftplib: socket.error during/after LIST//ssl._sslobj.shutdown()/连接超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12321915/

相关文章:

python - 使用 Python ftplib ftp.dir() 或 ftp.retrlines ('LIST' ) 仅返回包含字符串的文件

python - 在 Windows 上安装 Pinax

python - "version"和 "release"的标准 Python 含义是什么?

python - “在 <字符串>”中类型错误 : How to compare input string to a list(array)

python - 如何使用 scrapy 和 python 动态抓取 Tripadvisor

Python:ftplib和os Errno13(从ftp服务器下载所有文件)

python - 如何将 Scikit-Learn-Keras 模型保存到持久性文件 (pickle/hd5/json/yaml)

python - 量化坐标的相对位置 - python

python - 是否有像 __getattr__ 这样的函数被类变量调用?

python - 通过 ftplib 了解 FTP 是否仍然连接