zoukankan      html  css  js  c++  java
  • python文件服务器

    # -*- coding: UTF-8 -*-
    
    import os
    import sys
    import json
    import paramiko
    
    from flask import Flask,abort,request,render_template,send_from_directory
    from werkzeug.utils import secure_filename
    
    app = Flask(__name__)
    
    app.config['UPLOAD_FOLDER'] = os.path.join(os.path.dirname(__file__),'files')
    app.config['MAX_CONTENT_LENGTH'] = 1024 * 1024 * 1024
    
    def execute(ip, port, user, passwd, cmd):
        cmd = cmd.strip()
        cmd = (cmd + ';') if not cmd.endswith(';') else cmd
        cmd = cmd.replace(';', ' 1>&2;')
        print(cmd)
        client = paramiko.SSHClient()
        client.load_host_keys(filename="/root/.ssh/known_hosts")
        client.set_missing_host_key_policy(paramiko.AutoAddPolicy)
        client.connect(hostname=ip, port=port, username=user, password=passwd)
        stdin, stdout, stderr = client.exec_command(cmd)
        result = stderr.read()
        client.close()
        return result
    
    @app.route('/upload/<username>',methods=['POST'])
    def upload(username):
        if request.method == 'POST':
            print(request.args, request.headers)
            file = request.files['file']
            filename = secure_filename(file.filename)
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], username, filename))
            result = ("upload %s success
    " % filename)
            #触发回调
            try:
                fullfilename = os.path.join(app.config['UPLOAD_FOLDER'], username, filename)
                cmdfile = fullfilename + ".cmd.json"
                #print(cmdfile)
                if os.path.exists(cmdfile):
                    with open(cmdfile) as fin:
                        cfs = json.loads(fin.read())
                        cb = cfs["default"]
                        result += execute(cb["ip"], cb["port"], cb["user"], cb["password"], cb["cmd"])
                        #print("execute returned")
            except Exception as e:
                result += str(e)
            return result
    
    @app.route('/download/<username>/<filename>',methods=['GET','POST'])
    def download(username, filename):
        print(filename)
        if ('/' in filename) or filename.endswith(r'cmd.json'):
            abort(404);
        else:
            userdir = os.path.join(app.config['UPLOAD_FOLDER'], username)
            return send_from_directory(userdir, filename)
    
    if __name__ == '__main__':
        host = '0.0.0.0' if len(sys.argv) < 2 else sys.argv[1]
        port = 80 if len(sys.argv) < 3 else int(sys.argv[2])
        try:
            app.run(host=host, port=port)
        except Exception as e:
            print(e)
    
    
    诸神对凡人心生艳羡,厌倦天堂。
  • 相关阅读:
    JS随笔
    tp5 redis 单例模式 转载
    分享我编程工作经历及对软件开发前景的看法
    redis详解(一)-- 概述
    redis详解(二)-- 数据类型详解
    redis详解(四)-- 高可用分布式集群
    redis详解(三)
    新工科平台
    关于Nginx的负载均衡
    微信退款回调
  • 原文地址:https://www.cnblogs.com/dirge/p/14747920.html
Copyright © 2011-2022 走看看