Имитация терминала linux в браузере
Я прочитал о симуляции Linux в Fabrice Bellard в браузере.
Как работает эмулятор Linux в Javascript от Fabrice Bellard?
Сегодня я наткнулся на этот сайт, где имитирует полный linux-терминал в браузере, я могу запустить python, perl и т.д. Я знаю, что они запускают свой сайт на node.js, но я не мог понять как они точно имитируют терминал.
http://runnable.com/UWRl3KlLuONCAACG/read-files-from-filesystem-in-python
Ответы
Ответ 1
Полный linux http://docker.io, остальное https://github.com/Runnable/dockworker
Мы не моделируем терминал, но, как говорит Кайл, реплицируя терминал через websockets (с резервным копированием ajax).
В браузере мы используем https://github.com/chjj/term.js, который был получен из эмулятора Fabrice Bellard. Он обрабатывает выход, а также захват нажатия клавиш.
Ответ 2
Позвольте мне прикрепить это, сказав, что это НЕ хорошая идея.
Но вы можете создать оболочку и использовать веб-сокеты или XMLHttpRequests, чтобы нажимать нажатия клавиш на серверный процесс. Вот рабочий пример того, который работает в окнах. К сожалению, мне не удалось подключиться/выяснить 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;
}
}
});
});
Изменить: На самом деле, это часть рабочего примера. Он пропускает клиентскую сторону, где вы захватываете и посылаете нажатия клавиш на сервер. Но, это должно дать вам общую идею.