from flask import Flask, render_template, request, jsonify, session import subprocess import os import threading import uuid from datetime import datetime app = Flask(__name__) app.secret_key = 'your-secret-key-here' # Измените на случайный ключ # Безопасные команды (можно расширить) SAFE_COMMANDS = ['ls', 'pwd', 'whoami', 'date', 'uptime', 'uname', 'df', 'free'] class CommandSession: def __init__(self): self.sessions = {} def create_session(self): session_id = str(uuid.uuid4()) self.sessions[session_id] = { 'created_at': datetime.now(), 'working_dir': os.getcwd() } return session_id def execute_command(self, session_id, command): if session_id not in self.sessions: return "Сессия не найдена" session_data = self.sessions[session_id] # Безопасность: проверяем команду cmd_parts = command.strip().split() if not cmd_parts: return "" base_command = cmd_parts[0] # Ограничиваем доступные команды для безопасности if base_command not in SAFE_COMMANDS: return f"Команда '{base_command}' не разрешена для выполнения" try: # Выполняем команду в текущей директории сессии result = subprocess.run( command, shell=True, capture_output=True, text=True, cwd=session_data['working_dir'], timeout=30 # Таймаут 30 секунд ) output = result.stdout if result.stderr: output += f"\nОшибка: {result.stderr}" return output except subprocess.TimeoutExpired: return "Ошибка: команда выполнялась слишком долго" except Exception as e: return f"Ошибка выполнения: {str(e)}" command_manager = CommandSession() @app.route('/') def index(): if 'session_id' not in session: session['session_id'] = command_manager.create_session() return render_template('index.html') @app.route('/execute', methods=['POST']) def execute_command(): if 'session_id' not in session: return jsonify({'error': 'Сессия не найдена'}) data = request.get_json() command = data.get('command', '').strip() if not command: return jsonify({'error': 'Пустая команда'}) # Выполняем команду output = command_manager.execute_command(session['session_id'], command) return jsonify({ 'output': output, 'command': command, 'timestamp': datetime.now().strftime('%H:%M:%S') }) @app.route('/sessions', methods=['GET']) def list_sessions(): return jsonify({ 'active_sessions': len(command_manager.sessions), 'current_session': session.get('session_id') }) @app.route('/clear-session', methods=['POST']) def clear_session(): session_id = session.get('session_id') if session_id in command_manager.sessions: del command_manager.sessions[session_id] session.pop('session_id', None) return jsonify({'message': 'Сессия очищена'}) if __name__ == '__main__': # Создаем папку для шаблонов если её нет os.makedirs('templates', exist_ok=True) # Создаем HTML шаблон with open('templates/index.html', 'w', encoding='utf-8') as f: f.write('''