# -*- 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)