首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在浏览器中模拟linux终端

在浏览器中模拟linux终端
EN

Stack Overflow用户
提问于 2013-10-24 16:48:26
回答 2查看 29.8K关注 0票数 18

我在浏览器中读到了Fabrice的linux模拟。

How does Linux emulator in Javascript by Fabrice Bellard work?

今天我偶然发现了这个网站,他们在浏览器中模拟完整的linux终端,我可以运行python,perl等等。我知道他们在node.js上运行他们的网站,但我不知道他们是如何准确地模拟终端的。

http://runnable.com/UWRl3KlLuONCAACG/read-files-from-filesystem-in-python

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-28 08:44:30

完整的linux是http://docker.io,其余的是https://github.com/Runnable/dockworker

我们不是在模拟终端,而是像Kyle所说的那样,通过websockets复制终端(使用ajax后备)。

在浏览器中,我们使用的是https://github.com/chjj/term.js,它是从Fabrice的模拟器派生而来的。它处理输出,也处理击键捕获。

票数 21
EN

Stack Overflow用户

发布于 2013-11-07 00:35:56

让我在前面说这样做不是一个好主意。

但是,您可以生成一个shell,并使用web-sockets或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;
        }
      }
    });
  });

编辑:实际上,这是工作示例的一部分。它缺少捕获击键并将其发送到服务器的客户端。但是,它应该给你一个大概的概念。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19561188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档