問題描述
所以,我正在嘗試連接到 FTP 服務器以獲取目錄列表并下載文件.但是 prot_p()
函數之后的第一個命令引發了異常 - 從日志中產生這些錯誤:
So, I am trying to connect to an FTP server to get directory listings and download files. But the first command after the prot_p()
function is raising an exception - Producing these errors from the log:
*get* '150 Here comes the directory listing.
'
*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
'
*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: empdownload.py", line 29, in <module>
files = ftps.dir()
File "C:Python27libftplib.py", line 522, in dir
self.retrlines(cmd, func)
File "C:Python27libftplib.py", line 725, in retrlines
return self.voidresp()
File "C:Python27libftplib.py", line 224, in voidresp
resp = self.getresp()
File "C:Python27libftplib.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 引發了同樣的錯誤 - 盡管升級到最新版本修復了它.
I want to do this securely, hence using FTP over TLS Explicit. I have the idea that I may need to manipulate some settings in the Socket
class referenced by ftplib. Changing the settings on the server is not a possibility. I have tested the server successfully with FileZilla client, an older version of WinSCP was raising the same error - although an upgrade to the newest version fixed it.
有什么想法嗎?
推薦答案
現在可以通過這個類(FTP_TLS的后代)輕松修復Python 3.6+:
It can be now easily fixed for Python 3.6+ by this class (descendant of 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:
conn = self.context.wrap_socket(conn,
server_hostname=self.host,
session=self.sock.session) # this is the fix
return conn, size
這篇關于帶有 Python ftplib 的 FTPS - 需要會話重用的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!