计划用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文件,说明大功告成!
参考: