javascript - tutorial - python node rabbitmq
Simulando el terminal de linux en el navegador. (2)
La versión completa de Linux es http://docker.io , el resto es https://github.com/Runnable/dockworker
No estamos simulando el terminal, pero como dice Kyle, replicamos el terminal a través de websockets (con un respaldo de ajax).
En el navegador, estamos usando https://github.com/chjj/term.js que se derivó del emulador de Fabrice Bellard. Maneja la salida, y también la captura de pulsaciones de teclas.
He leído acerca de la simulación de Linux de Fabrice Bellard en el navegador.
¿Cómo funciona el emulador de Linux en Javascript de Fabrice Bellard?
Hoy me topé con este sitio, donde están simulando el terminal completo de Linux en el navegador, puedo ejecutar python, perl, etc. Sé que están ejecutando su sitio en node.js, pero no pude descubrir cómo simulaban exactamente la terminal.
http://runnable.com/UWRl3KlLuONCAACG/read-files-from-filesystem-in-python
Permítanme prefijar esto diciendo que NO es una buena idea hacer esto.
Pero, puede generar un shell y usar sockets web o XMLHttpRequests para enviar pulsaciones de teclas al proceso del servidor generado. Aquí hay un ejemplo de trabajo de uno que se ejecuta en Windows. Desafortunadamente, no logré conectar / descifrar Ctrl + c. Pero, debe obtener la esencia de la misma.
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;
}
}
});
});
Edición: En realidad, esta es una parte de un ejemplo de trabajo. Falta el lado del cliente donde captura y envía las pulsaciones al servidor. Pero, debería darle la idea general.