• 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

  • 相关阅读:
    mark
    ON DUPLICATE KEY UPDATE重复插入时更新
    lnmp上传文件
    websoket
    Nginx 和 Php 优化
    Nginx常见问题
    Keepalived 高可用
    https ; 及https证书
    Nginx动静分离;资源分离;rewrite重写、跳转、伪静态、规则、日志
    nginx负载均衡会话保持;四层负载均衡;端口转发
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/13613553.html
Copyright © 2020-2023  润新知