Python中如何使用xterm.js限制输入的命令

比如只允许前端输入某些命令,因为目前用的方法是一个字符一个字符发送的,我感觉没法做。

后端是 python,获取到字符后直接发送到服务器了,也是没辙。

有有经验的大佬没,请教


Python中如何使用xterm.js限制输入的命令
1 回复

要在Python后端使用xterm.js限制输入的命令,关键在于拦截并处理终端的键盘输入事件。这里提供一个完整的Flask + xterm.js实现方案:

后端代码 (app.py):

from flask import Flask, render_template_string
import json

app = Flask(__name__)

ALLOWED_COMMANDS = ['ls', 'pwd', 'echo', 'help', 'clear']

@app.route('/')
def index():
    return render_template_string('''
<!DOCTYPE html>
<html>
<head>
    <link rel="stylesheet" href="https://unpkg.com/xterm/css/xterm.css">
    <script src="https://unpkg.com/xterm/lib/xterm.js"></script>
    <script src="https://unpkg.com/xterm-addon-fit/lib/xterm-addon-fit.js"></script>
</head>
<body>
    <div id="terminal"></div>
    <script>
        const term = new Terminal();
        const fitAddon = new FitAddon.FitAddon();
        term.loadAddon(fitAddon);
        term.open(document.getElementById('terminal'));
        fitAddon.fit();
        
        const allowedCommands = {{ allowed_commands|tojson }};
        let currentInput = '';
        
        // 键盘输入拦截
        term.onKey(e => {
            const char = e.key;
            const domEvent = e.domEvent;
            
            if (domEvent.key === 'Enter') {
                if (allowedCommands.includes(currentInput.trim().split(' ')[0])) {
                    term.write('\r\n$ ');
                    // 这里可以发送命令到后端执行
                    console.log('执行命令:', currentInput);
                } else {
                    term.write('\r\n命令不允许: ' + currentInput);
                    term.write('\r\n允许的命令: ' + allowedCommands.join(', '));
                }
                currentInput = '';
                term.write('\r\n$ ');
            } else if (domEvent.key === 'Backspace') {
                if (currentInput.length > 0) {
                    currentInput = currentInput.slice(0, -1);
                    term.write('\b \b');
                }
            } else if (char.length === 1) {
                currentInput += char;
                term.write(char);
            }
        });
        
        term.write('$ ');
    </script>
</body>
</html>
''', allowed_commands=ALLOWED_COMMANDS)

if __name__ == '__main__':
    app.run(debug=True)

核心机制:

  1. 前端通过term.onKey监听所有键盘事件
  2. 维护currentInput变量累积输入字符
  3. 按下Enter时检查命令是否在白名单中
  4. 通过allowedCommands.includes()验证命令前缀

更严格的验证方案:

// 精确匹配命令和参数
function validateCommand(input) {
    const parts = input.trim().split(/\s+/);
    const cmd = parts[0];
    
    // 只允许特定命令
    if (!allowedCommands.includes(cmd)) return false;
    
    // 可添加参数验证
    if (cmd === 'echo' && parts.length > 3) return false;
    
    return true;
}

安装运行:

pip install flask
python app.py

访问 http://localhost:5000 即可看到带命令限制的终端。

总结:核心是在前端拦截并验证输入。

回到顶部