I am running an FTP server with python 3.X on a windows 10 computer. I have a script where I can upload a whole directory into my server. This works with no issue. However when I try to download the respective folder/files I am given the error ftplib.error_perm: 550 Permission denied. I have checked that the current working directory (CWD) is correct and that the files do exist on the server. What could the issue be? Here are my server.py
, download.py
, and uploader.py
scripts:
Server.py
from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer
# The port the FTP ServerFiles will listen on.
# This must be greater than 1023 unless you run this script as root.
FTP_PORT = 2121
# The directory the FTP user will have full read/write access to.
FTP_DIRECTORY = "ServerFiles"
def main():
authorizer = DummyAuthorizer()
# Define a new user having full r/w permissions.
authorizer.add_user('MirOS-Client', 'client@miros', FTP_DIRECTORY, perm='elradfmw')
authorizer.add_user('MirOS-Admin', 'admin@miros$358', FTP_DIRECTORY, perm='elradfmw')
handler = FTPHandler
handler.authorizer = authorizer
# Define a customized banner (string returned when client connects)
handler.banner = "Connection secured to MirOS-Server."
address = ('IPADDRESS', FTP_PORT)
server = FTPServer(address, handler)
server.max_cons = 256
server.max_cons_per_ip = 5
server.serve_forever()
if __name__ == '__main__':
main()
Downloader.py
import ftplib
FTP_HOST = "IPADDRESS"
FTP_USER = "MirOS-Client"
FTP_PASS = "client@miros"
# Connecting to ServerFiles and logging in
ftp = ftplib.FTP()
ftp.connect(FTP_HOST, 2121)
ftp.login(FTP_USER,FTP_PASS)
# force UTF-8 encoding
ftp.encoding = "utf-8"
# the name of file you want to download from the FTP ServerFiles
print(ftplib.FTP.dir(ftp))
filename = "folder"
with open(filename, "wb") as file:
# use FTP's RETR command to download the file
ftp.retrbinary(f"RETR {filename}", file.write)
# quit and close the connection
ftp.quit()
Uploader.py
import ftplib
import os
# FTP ServerFiles credentials
FTP_HOST = "IPADDRESS"
FTP_USER = "MirOS-Admin"
FTP_PASS = "admin@miros$358"
def upload_dir(ftp, path):
for name in os.listdir(path):
local_path = os.path.join(path, name)
if os.path.isfile(local_path):
print(f" uploading file {name} ...", end="")
with open(local_path, 'rb') as file:
ftp.storbinary(f'STOR {name}', file)
print(" done.")
elif os.path.isdir(local_path):
print(f"making directory {name} ...", end="")
try:
ftp.mkd(name)
except:
print(" already exists.", end="")
print(" navigating into ...", end="")
ftp.cwd(name)
print(" done.")
upload_dir(ftp, local_path)
print(f" navigating up ...", end="")
ftp.cwd('..')
print(" done.")
ftp = ftplib.FTP()
ftp.connect(FTP_HOST, 2121)
ftp.login(FTP_USER, FTP_PASS)
upload_dir(ftp, 'updatefiles') # your local directory path
ftp.quit()
Any ideas??