Python3.6,ftp_tls和会话重用

时间:2018-01-15 10:00:12

标签: python python-3.x ftplib session-reuse

所以,我正在努力尝试将文件上传到需要会话重用的远程ftps服务器。

我必须指定即使我可以通过Filezilla连接到服务器而没有问题,我也会收到错误"未知的服务器证书"。

这是我的剧本:

import ftplib
import ssl

USER = "username"
PASS = "password"
SERVER = "1.2.3.4"
PORT = 21
BINARY_STORE = True

filepath = '/path/to/myfile.txt'
filename = 'myfile.txt'

content = open(filepath, 'rb')
ftp = ftplib.FTP_TLS()
ftp.set_debuglevel(2)
print (ftp.connect(SERVER, PORT))
print (ftp.login(USER, PASS))
print (ftp.prot_p())
print (ftp.set_pasv(True))

print (ftp.cwd("testfolder"))
print (ftp.storbinary('STOR %s' % filename, content))
ftp.quit()

但我收到此消息: 450 TLS数据连接会话未恢复或会话与控制连接不匹配

该文件是在服务器上创建的,但它是空的(0字节大小) 我已经阅读了十几篇文章,我清楚地知道我必须在客户端实现会话重用 - 这是Python 3.6支持的 - 但只是......我不知道如何做到这一点,因为我可以&找不到任何有效的例子。

有人建议扩展FTP_TLS类:

class MyFTP_TLS(ftplib.FTP_TLS):
    """Explicit FTPS, with shared TLS session"""
    def ntransfercmd(self, cmd, rest=None):
        conn, size = ftplib.FTP.ntransfercmd(self, cmd, rest)
        if self._prot_p:
            session = self.sock.session
            if isinstance(self.sock, ssl.SSLSocket):
                    session = self.sock.session
            conn = self.context.wrap_socket(conn,
                                            server_hostname=self.host,
                                            session=session)  # this is the fix
        return conn, size
ftp = MyFTP_TLS()
...

但现在服务器响应是:' SSLSocket'对象没有属性' session'

所以我被卡住了。我错过了什么?

1 个答案:

答案 0 :(得分:0)

这适合你吗?

from ftplib import FTP_TLS

USER = "username"
PASS = "password"
SERVER = "1.2.3.4"
PORT = 21 

ftps = FTP_TLS(SERVER)
ftps.login(USER, PASS)         
ftps.prot_p()         
ftps.set_pasv(True)