在浏览器中模拟Linux终端

19

3
通过 Ajax 请求... 尝试打开 Firefox Web 控制台,你会看到一系列的 Ajax 请求 :-) - StaleMartyr
如果你只需要UI部分,可以看一下这个链接:https://dev59.com/5Gcs5IYBdhLWcg3wXi1E#64217301 - Danziger
2个回答

22

太好了,我正在寻找这样的东西。 - DevC
2
我有一个简化版本的 nodeschool.io 工作坊服务:https://github.com/generalhenry/expose-bash-over-websockets https://github.com/generalhenry/nodeschool-interactive https://github.com/generalhenry/docker-gc https://github.com/generalhenry/nodeschool-dockerfiles - generalhenry
这个问题是4年前的,但我现在正在尝试做这件事,卡住了...有人知道如何在Meteor应用程序中放置Docker终端吗?我已经找到了https://github.com/mafintosh/docker-browser-console,但我无法让它为我工作。我将感激任何帮助。 - Jerome

4

首先声明,这不是一个好的做法。

但是,您可以生成一个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;
        }
      }
    });
  });

编辑:实际上,这是一个工作示例的一部分。它缺少客户端,您需要从客户端捕获和发送按键到服务器。但是,它应该能够给您一个大致的想法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接