我正在使用 xterm.js、react 和 node-pty 设置浏览器内终端。我已经通过 websockets 在服务器上运行了 node-pty 进程。终端实际工作,它在反应 UI 中可见。我可以使用以下方法将终端初始化为node
或python3
首次加载:
client.tty = pty.spawn("node", [], {
name: "xterm-color",
cols: 80,
rows: 24,
cwd: process.env.PWD,
env: process.env
});
我可以像这样杀死这个过程:
self.on("message", function(client, msg) {
if (msg === "kill") {
client.tty.kill(9);
}
client.tty && client.tty.write(msg);
});
只要在 UI 的终端中输入字符,就会触发此侦听器。
这感觉不像是处理这个问题的惯用方式,但我想做的是从 UI 中的 websocket 发出一条消息,这取决于反应状态,并node-pty
使用不同的初始 shell 重新生成一个新终端,即从 切换node
到python3
。
我发现销毁终端所在的 HTML 节点会导致open
服务器上的侦听器再次触发,但我认为重新打开时不可能包含消息。
self.on("open", (client, test) => {
client.tty = pty.spawn("node", [], {
name: "xterm-color",
cols: 80,
rows: 24,
cwd: process.env.PWD,
env: process.env
});
const ttyId = client.tty._pty
client.tty.on("exit", function(code, signal) {
client.tty = null;
client.close();
});
client.tty.on("data", (data) => {
client.send(data);
});
});
我的问题是,如何重新生成node-pty
进程并动态更改 shell 类型?