計划用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:\test\1.txt") upload_file(ftp, r"/temp2/2.txt", r"D:\test\1.txt") ftp.quit()
查看/temp/發現果然多了一個2.txt文件,說明大功告成!
參考: