from flask import Flask, render_template from flask_socketio import SocketIO, emit import pty import os import subprocess import threading app = Flask(__name__) app.config['SECRET_KEY'] = 'your_secret_key' socketio = SocketIO(app) def run_shell(): master_fd, slave_fd = pty.openpty() process = subprocess.Popen(['bash'], stdin=slave_fd, stdout=slave_fd, stderr=slave_fd, text=True) while True: output = os.read(master_fd, 1024).decode('utf-8') if output: socketio.emit('output', output) # 这里可以添加一个小的延迟,避免CPU占用过高 socketio.sleep(0.1) @app.route('/') def index(): return render_template('index.html') @socketio.on('input') def handle_input(input_data): # 将输入写入伪终端 os.write(shell_master_fd, (input_data + '\n').encode('utf-8')) if __name__ == '__main__': shell_master_fd, shell_slave_fd = pty.openpty() shell_thread = threading.Thread(target=run_shell) shell_thread.start() socketio.run(app, host='0.0.0.0', port=7860)