gpt4 book ai didi

python - 使用 Python ftplib 的 FTPS - 需要 session 重用

转载 作者:太空宇宙 更新时间:2023-11-03 14:24:23 26 4
gpt4 key购买 nike

因此,我正在尝试连接到 FTP 服务器以获取目录列表和下载文件。但是 prot_p() 函数之后的第一个命令引发异常 - 从日志中产生这些错误:

*get* '150 Here comes the directory listing.\r\n'
*resp* '150 Here comes the directory listing.'
*get* '522 SSL connection failed; session reuse required: see require_ssl_reuse
option in vsftpd.conf man page\r\n'
*resp* '522 SSL connection failed; session reuse required: see require_ssl_reuse
option in vsftpd.conf man page'
Traceback (most recent call last):
File "C:\temp\download.py", line 29, in <module>
files = ftps.dir()
File "C:\Python27\lib\ftplib.py", line 522, in dir
self.retrlines(cmd, func)
File "C:\Python27\lib\ftplib.py", line 725, in retrlines
return self.voidresp()
File "C:\Python27\lib\ftplib.py", line 224, in voidresp
resp = self.getresp()
File "C:\Python27\lib\ftplib.py", line 219, in getresp
raise error_perm, resp
ftplib.error_perm: 522 SSL connection failed; session reuse required: see requir
e_ssl_reuse option in vsftpd.conf man page

代码如下:

from ftplib import FTP_TLS
import os
import socket

host = 'example.com'
port = 34567
user = 'user1'
passwd = 'pass123'
acct = 'Normal'

ftps = FTP_TLS()

ftps.set_debuglevel(2)

ftps.connect(host, port)

print(ftps.getwelcome())
print(ftps.sock)

ftps.auth()

ftps.login(user, passwd, acct)

ftps.set_pasv(True)
ftps.prot_p()

print('Current directory:')
print(ftps.pwd())
files = ftps.dir()

ftps.quit()

我想安全地执行此操作,因此使用 FTP over TLS Explicit。我的想法是我可能需要在 ftplib 引用的 Socket 类中操作一些设置。更改服务器上的设置是不可能的。我已经使用 FileZilla 客户端成功测试了服务器,旧版本的 WinSCP 引发了同样的错误 - 尽管升级到最新版本修复了它。

有什么想法吗?

最佳答案

现在可以通过此类(FTP_TLS 的后代)轻松修复 Python 3.6+:

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:
conn = self.context.wrap_socket(conn,
server_hostname=self.host,
session=self.sock.session) # this is the fix
return conn, size

它从最初的“控制”FTP 连接中获取 TLS session 信息,并将其重复用于每一个第二个“数据”连接,该连接经常为文件主体或目录列表的每个新数据传输而创建和关闭。重用对服务器有利,因为它不需要多次重复 TLS 握手。这正是您在消息 session reuse required 中看到的。

关于python - 使用 Python ftplib 的 FTPS - 需要 session 重用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58217582/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com