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)
核心机制:
- 前端通过
term.onKey监听所有键盘事件 - 维护
currentInput变量累积输入字符 - 按下Enter时检查命令是否在白名单中
- 通过
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 即可看到带命令限制的终端。
总结:核心是在前端拦截并验证输入。

