Javascript 在浏览器中模拟linux终端
我在浏览器中读到了Fabrice Bellard的linux模拟 今天我偶然发现了这个网站,他们在浏览器中模拟完整的linux终端,我可以运行python、perl等。我知道他们在node.js上运行他们的网站,但我不知道他们是如何精确模拟终端的Javascript 在浏览器中模拟linux终端,javascript,python,linux,node.js,simulator,Javascript,Python,Linux,Node.js,Simulator,我在浏览器中读到了Fabrice Bellard的linux模拟 今天我偶然发现了这个网站,他们在浏览器中模拟完整的linux终端,我可以运行python、perl等。我知道他们在node.js上运行他们的网站,但我不知道他们是如何精确模拟终端的 让我先说,这样做不是个好主意 但是,您可以生成一个shell,并使用web套接字或XMLHttpRequests将按键推送到生成的服务器进程。下面是一个在windows上运行的示例。不幸的是,我没有抽出时间来连接/计算Ctrl+c。但是,你应该了解它
让我先说,这样做不是个好主意 但是,您可以生成一个shell,并使用web套接字或XMLHttpRequests将按键推送到生成的服务器进程。下面是一个在windows上运行的示例。不幸的是,我没有抽出时间来连接/计算Ctrl+c。但是,你应该了解它的要点
require("underscore");
var Server = {},
express = require("express"),
path = require("path"),
sys = require("sys"),
application_root = __dirname;
global.Server = Server;
Server.root = application_root;
global.app = express();
Server.setup = require("./lib/setup.js").setup({
//redis: require("./lib/redis-client").createClient(),
app: app,
//mongoose : require("mongoose"),
io : require("socket.io"),
express : express,
port: 1773,
paths : {
views : path.join(application_root,"app","views"),
root : path.join(application_root,"public"),
controllers : path.join(application_root,"app","controllers"),
models : path.join(application_root,"app","models")
}
});
var proc = require('child_process'),
cmd;
app.socket.on('connection', function(socket) {
if (!cmd) {
//console.log('spawning cmd');
cmd = proc.spawn('cmd');
//console.log(cmd?'CMD started':'CMD not started');
if (cmd.stdout) {
//console.log('stdout present');
cmd.stdout.on('data',function(data) {
if (data) {
//console.log("data: "+data);
socket.emit('cmd', ""+data);
}
});
}
if (cmd.stderr) {
cmd.stderr.on('data', function(data) {
//console.log('stderr present');
if (data) {
socket.emit('cmd', ""+data);
}
});
}
cmd.on('exit', function() {
//console.log('cmd exited');
socket.emit('cmd', '[CMD Shutdown]');
if (cmd) {
cmd.kill();
cmd = null;
}
});
}
socket.on('sendCmd', function(data) {
if (data && data.buffer) {
var kB = data.buffer.replace("\r","\n");
if (cmd && cmd.stdin) {
cmd.stdin.write(kB);
}
}
});
socket.on('disconnect', function() {
console.log('connection closed');
if (cmd) {
cmd.stdin.end(); //.kill();
if (cmd) {
cmd.kill();
cmd = null;
}
}
});
});
编辑:实际上,这是一个工作示例的一部分。它缺少捕获击键并将其发送到服务器的客户端。但是,它应该给你一个大概的想法。完整的linux是,其余的是
我们不是在模拟终端,而是如Kyle所说,通过WebSocket复制终端(使用ajax回退)
在我们使用的浏览器中,它是从Fabrice Bellard的emulator派生出来的。它处理输出和击键捕获。通过ajax请求…尝试打开firefox webconsole,您可以看到一系列ajax请求:-)如果您只需要其中的UI部分,请查看以下内容:完美。。我一直在寻找类似的东西。我有一个简化版本,提供给nodeschool.io研讨会:这个问题是4年前提出的,但实际上我正在尝试这样做,我被卡住了。。。有人知道如何在Meteor应用程序中安装Docker终端吗?我已经建立了,但我不能让它为我工作。我将感谢任何帮助