Я создал программу (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'