Запуск Flask в качестве подпроцесса под Windows - PullRequest
0 голосов
/ 06 сентября 2018

Я пишу инструмент на python для взаимодействия с удаленным агентом PowerShell (в основном PowerShell Empire, но для PS v1). Я хочу использовать HTTP (S) в качестве транспортного средства для команд и вывода между агентом и пользовательским интерфейсом.

Для этого у меня есть Flask, работающий как подпроцесс, а затем я представляю пользователю простую командную строку в главном потоке. Это прекрасно работает в Linux, но в Windows я сталкиваюсь со следующей ошибкой при вызове start на Process:

TypeError("can't pickle _thread.lock objects")

Я считаю, что это связано с тем, как Windows обрабатывает потоки в Process es. Кто-нибудь может предложить способ заставить это работать на Windows? Мой код ниже:

from flask import Flask, request
from multiprocessing import Process, Queue
import logging

port = 8080 # TODO: set this from cmdline args

cmds = Queue()
quitting = Queue()

app = Flask(__name__)
@app.route('/', methods=['GET'])
def get_command():
    if cmds.empty():
        return ''
    else:
        return cmds.get()

@app.route('/', methods=['POST'])
def get_output():
    if request.data.decode() == "quitting":
        quitting.put(True)
    print("{} ".format(request.data.decode()),end='\n> ')
    return ''

if __name__ == "__main__":
    log = logging.getLogger('werkzeug')
    log.setLevel(logging.ERROR)

    t = Process(target=app.run, kwargs={'host': '0.0.0.0'})
    t.start()

    running = True
    while running:
        cmd = input("> ")
        if cmd == "kill" or cmd =="quit":
            print("Waiting for agent to close...")
            cmds.put("quit")
            while quitting.empty():
                pass
            t.terminate()
            t.join()
            running = False
        else:
            cmds.put(cmd)
...