Невозможно отобразить каталог или изменить каталог на сервере FTPS, используя Python - PullRequest
0 голосов
/ 02 мая 2020

Я создал программу (ImplicitTLS.py) для подключения к серверу FTPS, ссылаясь на эту ссылку Python Проблема неявного FTP-соединения с FTP и другую программу, в которую я даю учетные данные, соответствующие "ImplicitTLS.py". почему код не может перечислить каталог или изменить директорию? А также я хотел загрузить файлы CSV в этот FTPS_DIR на ftps-сервере

1.ImplicitTLS .py:

import ftplib, socket, ssl
FTPTLS_OBJ = ftplib.FTP_TLS

# Class to manage implicit FTP over TLS connections, with passive transfer mode
# - Important note:
#   If you connect to a VSFTPD server, check that the vsftpd.conf file contains
#   the property require_ssl_reuse=NO
class FTPTLS(FTPTLS_OBJ):

    host = "127.0.0.1"
    port = 990
    user = "anonymous"
    timeout = 60

    logLevel = 0

    # Init both this and super
    def __init__(self, host=None, user=None, passwd=None, acct=None, keyfile=None, certfile=None, context=None, timeout=60):        
        FTPTLS_OBJ.__init__(self, host, user, passwd, acct, keyfile, certfile, context, timeout)

    # Custom function: Open a new FTPS session (both connection & login)
    def openSession(self, host="127.0.0.1", port=990, user="anonymous", password=None, timeout=60):
        self.user = user
        # connect()
        ret = self.connect(host, port, timeout)
        # prot_p(): Set up secure data connection.
        try:
            ret = self.prot_p()
            if (self.logLevel > 1): self._log("INFO - FTPS prot_p() done: " + ret)
        except Exception as e:
            if (self.logLevel > 0): self._log("ERROR - FTPS prot_p() failed - " + str(e))
            raise e
        # login()
        try:
            ret = self.login(user=user, passwd=password)
            if (self.logLevel > 1): self._log("INFO - FTPS login() done: " + ret)
        except Exception as e:
            if (self.logLevel > 0): self._log("ERROR - FTPS login() failed - " + str(e))
            raise e
        if (self.logLevel > 1): self._log("INFO - FTPS session successfully opened")

    # Override function
    def connect(self, host="127.0.0.1", port=990, timeout=60):
        self.host = host
        self.port = port
        self.timeout = timeout
        try:
            self.sock = socket.create_connection((self.host, self.port), self.timeout)
            self.af = self.sock.family
            self.sock = ssl.wrap_socket(self.sock, self.keyfile, self.certfile)
            self.file = self.sock.makefile('r')
            self.welcome = self.getresp()
            if (self.logLevel > 1): self._log("INFO - FTPS connect() done: " + self.welcome)
        except Exception as e:
            if (self.logLevel > 0): self._log("ERROR - FTPS connect() failed - " + str(e))
            raise e
        return self.welcome

    # Override function
    def makepasv(self):
        host, port = FTPTLS_OBJ.makepasv(self)
        # Change the host back to the original IP that was used for the connection
        host = socket.gethostbyname(self.host)
        return host, port

    # Custom function: Close the session
    def closeSession(self):
        try:
            self.close()
            if (self.logLevel > 1): self._log("INFO - FTPS close() done")
        except Exception as e:
            if (self.logLevel > 0): self._log("ERROR - FTPS close() failed - " + str(e))
            raise e
        if (self.logLevel > 1): self._log("INFO - FTPS session successfully closed")

    # Private method for logs
    def _log(self, msg):
        # Be free here on how to implement your own way to redirect logs (e.g: to a console, to a file, etc.)
        print(msg)

2.test_ftp.py:

from ImplicitTLS import FTPTLS
import os,sys
import ftplib
from ftplib import FTP_TLS
from ftplib import FTP

host = "11.22.333.44"
port = 990
user = "abc"
password = "xyz"

myFtps = FTPTLS()
my =ftplib.FTP()
myFtps.logLevel = 2
myFtps.openSession(host, port, user, password)
#myFtps.cwd()
my.set_pasv(False)
my.cwd("/FTPS_DIR")
my.dir()
#print(myFtps.retrlines("LIST"))
#myFtps.retrlines("LIST")
myFtps.closeSession()

** Получил ошибку: **

C:\Users\gyn\scripts\Ftps_code\ftps_audit>test_ftp.py
INFO - FTPS connect() done: 220-FileZilla Server 0.9.60 beta
220-written by xyz_user (abc.defgh@filezilla-project.org)
220 Please visit https://filezilla-project.org/
INFO - FTPS prot_p() done: 200 Protection level set to P
INFO - FTPS login() done: 230 Logged on
INFO - FTPS session successfully opened
Traceback (most recent call last):
  File "C:\Users\gyn\scripts\Ftps_code\ftps_audit\test_ftp.py", line 19, in <module>
    my.cwd("/HaloItemMaster")
  File "C:\Users\byn\AppData\Local\Programs\Python\Python38-32\lib\ftplib.py", line 614, in cwd
    return self.voidcmd(cmd)
  File "C:\Users\byn\AppData\Local\Programs\Python\Python38-32\lib\ftplib.py", line 279, in voidcmd
    self.putcmd(cmd)
  File "C:\Users\byn\AppData\Local\Programs\Python\Python38-32\lib\ftplib.py", line 201, in putcmd
    self.putline(line)
  File "C:\Users\byn\AppData\Local\Programs\Python\Python38-32\lib\ftplib.py", line 196, in putline
    self.sock.sendall(line.encode(self.encoding))
AttributeError: 'NoneType' object has no attribute 'sendall' 
...