복붙노트

[PYTHON] FTPES - 세션 재사용 필요

PYTHON

FTPES - 세션 재사용 필요

그래서, 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에서는 동일한 오류가 발생했습니다. 최신 버전으로 업그레이드해도 문제는 해결되었습니다.

어떤 아이디어?

해결법

  1. ==============================

    1.이 클래스 (FTP_TLS의 자손)에 의해 Python 3.6+에서 쉽게 수정 될 수 있습니다 :

    이 클래스 (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
    
  2. ==============================

    2.최신 버전으로의 업그레이드가이 문제를 수정했다고 언급 할 때 ftplib보다 vsftpd 문제가 더 많이 보입니다.

    최신 버전으로의 업그레이드가이 문제를 수정했다고 언급 할 때 ftplib보다 vsftpd 문제가 더 많이 보입니다.

    비록 당신이 서버의 설정을 만질 수 없다면, FTP_TLS를 서브 클래스로 분류하면 문제를 해결할 수 있지만, 제 의견으로는 상당히 해킹입니다. 따라서이 질문에 대한 답변과 파이썬 FTP TLS 연결 문제에 대한 답변을 참조하십시오. 이 python 버그 이슈 19500에서 살펴볼 수도 있습니다.

    희망이 도움이됩니다.

  3. from https://stackoverflow.com/questions/14659154/ftpes-session-reuse-required by cc-by-sa and MIT license