python实现简单FTP服务器

计划用python写一个简单的分布式调度系统,仔细分析了一下发现需要几个子系统,包括连接zk的组件,按时间调度的模块,存储用户的可执行文件的ftp服务等

今天先实现一个小目标,用python做一个FTP服务器,然后实现简单的上传下载功能。

ftp_server.py

import configparser

from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler, ThrottledDTPHandler
from pyftpdlib.servers import FTPServer

from ftp.setting import ENABLE_ANONYMOUS, ANONYMOUS_PATH, MAX_DOWNLOAD, MAX_UPLOAD, PASSIVE_PORTS, WELCOME_MSG, IP, 
    PORT, MAX_CONS, MAX_PER_IP

# 新建一个用户组
authorizer = DummyAuthorizer()

# 从文件读取用户账号密码权限配置
config = configparser.ConfigParser()
config.read('user.ini')
user_list = config.sections()
for user in user_list:
    passwd = config[user]["password"]
    perm = config[user]["perm"]
    home_dir = config[user]["home"]
    # 将用户名,密码,指定目录,权限 添加到里面
    authorizer.add_user(user, passwd, homedir=home_dir, perm=perm)

# 添加匿名用户 只需要路径
if ENABLE_ANONYMOUS == 'on':
    authorizer.add_anonymous(ANONYMOUS_PATH)

# 下载上传速度设置
dtp_handler = ThrottledDTPHandler
dtp_handler.read_limit = MAX_DOWNLOAD
dtp_handler.write_limit = MAX_UPLOAD

# 初始化ftp句柄
handler = FTPHandler
handler.authorizer = authorizer

# 添加被动端口范围
handler.passive_ports = range(PASSIVE_PORTS[0], PASSIVE_PORTS[1])

# 欢迎信息
handler.banner = WELCOME_MSG

# 监听ip 和 端口
server = FTPServer((IP, PORT), handler)

# 最大连接数
server.max_cons = MAX_CONS
server.max_cons_per_ip = MAX_PER_IP

# 开始服务
print('FTP开始服务 ', (IP, PORT))
server.serve_forever()

ftp_server.py用到了一些配置文件setting.py和user.ini

IP = '127.0.0.1'
PORT = '21'
# 上传速度  100kb/s
MAX_UPLOAD = 100 * 1024
# 下载速度 100kb/s
MAX_DOWNLOAD = 100 * 1024
# 最大连接数
MAX_CONS = 100
# 最多IP数
MAX_PER_IP = 10
# 被动端口范围,注意被动端口数量要比最大IP数多,否则可能出现无法连接的情况
PASSIVE_PORTS = (8300, 8500)
# 是否开启匿名访问 on|off
ENABLE_ANONYMOUS = 'off'
# 匿名用户目录
ANONYMOUS_PATH = 'E:/ftp/temp'
# 日志文件
LOGING_NAME = 'pyftp.log'
# 欢迎信息
WELCOME_MSG = 'Welcome to my ftp'

user.ini

[alex]
password=123
perm=elradfmwM
home=E:/ftp/

[egon]
password=123456
perm=elradfmwM
home=E:/ftp/

将ftp_server.py开启了,就可以在浏览器查看这个ftp服务器了

 在浏览器上可以下载,但是不能上传(也可能是我没有找到),所以又实现了一个ftp_client.py来实现上传下载功能。

ftp_client.py

# coding: utf-8

import os
from ftplib import FTP


# 构造FTP客户端
def ftp_connect(host, username, password):
    ftp_client = FTP()
    ftp_client.connect(host, 21)
    ftp_client.login(username, password)
    return ftp_client


# 从ftp服务器下载文件
def download_file(ftp, remote_path, local_path):
    buf_size = 1024
    fp = open(local_path, 'wb')
    ftp.retrbinary('RETR ' + remote_path, fp.write, buf_size)
    ftp.set_debuglevel(0)
    fp.close()


# 从本地上传文件到ftp
def upload_file(ftp, remote_path, local_path):
    bufsize = 1024
    fp = open(local_path, 'rb')
    ftp.storbinary('STOR '+ remote_path, fp, bufsize)
    ftp.set_debuglevel(0)
    fp.close()


if __name__ == "__main__":
    ftp = ftp_connect("127.0.0.1", "alex", "123")
    download_file(ftp, r"/temp/1.txt", r"D:	est1.txt")
    upload_file(ftp, r"/temp2/2.txt", r"D:	est1.txt")
    ftp.quit()

查看/temp/发现果然多了一个2.txt文件,说明大功告成!

参考:

https://www.cnblogs.com/jiyanjiao-702521/p/10436094.html

https://www.cnblogs.com/huangxm/p/6274645.html

原文地址:https://www.cnblogs.com/wangbin2188/p/13613553.html