| import os |
| import pty |
| import select |
| import shlex |
| import subprocess |
| import threading |
|
|
| from flask import Flask, render_template, request, jsonify, send_from_directory |
| from flask_socketio import SocketIO, emit |
| import eventlet |
| eventlet.monkey_patch() |
|
|
| app = Flask(__name__) |
| socketio = SocketIO(app, cors_allowed_origins="*") |
|
|
| UPLOAD_DIR = "/tmp/vpskw/uploads" |
| os.makedirs(UPLOAD_DIR, exist_ok=True) |
|
|
| |
| master_fd, slave_fd = pty.openpty() |
| subprocess.Popen(["/bin/bash"], preexec_fn=os.setsid, stdin=slave_fd, stdout=slave_fd, stderr=slave_fd) |
|
|
| |
| @socketio.on('connect') |
| def connect(): |
| def read_output(): |
| while True: |
| r, _, _ = select.select([master_fd], [], []) |
| if master_fd in r: |
| output = os.read(master_fd, 1024).decode(errors="ignore") |
| socketio.emit('output', output) |
| threading.Thread(target=read_output, daemon=True).start() |
|
|
| |
| @socketio.on('input') |
| def handle_input(data): |
| os.write(master_fd, data.encode()) |
|
|
| |
| @app.route('/upload', methods=['POST']) |
| def upload(): |
| f = request.files['file'] |
| path = os.path.join(UPLOAD_DIR, f.filename) |
| f.save(path) |
| return jsonify({"status": "uploaded", "path": path}) |
|
|
| |
| @app.route('/') |
| def index(): |
| return render_template('index.html') |
|
|
| |
| @app.route('/xterm.js') |
| def xterm_js(): |
| return send_from_directory('static', 'xterm.js') |
|
|
| |
| if __name__ == "__main__": |
| socketio.run(app, host="0.0.0.0", port=7860) |