web-dev-qa-db-ja.com

ブラウザでのLinux端末のシミュレーション

ブラウザでのFabrice BellardのLinuxシミュレーションについて読みました。

Fabrice BellardによるJavascriptのLinuxエミュレーターはどのように機能しますか?

今日、私はこのサイトに出くわしました。ブラウザで完全なLinux端末をシミュレートしています。Python、Perlなどを実行できます。彼らがnode.jsでサイトを実行していることはわかっていますが、正確にシミュレートする方法を理解できませんでした。ターミナル。

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

18
DevC

完全なLinuxは http://docker.io 、残りは https://github.com/Runnable/dockworker です。

私たちはターミナルをシミュレートしていませんが、カイルが言うように、(ajaxフォールバックを使用して)Webソケットを介してターミナルを複製します。

ブラウザーでは、Fabrice Bellardのエミュレーターから派生した https://github.com/chjj/term.js を使用しています。出力と、キーストロークキャプチャも処理します。

21
generalhenry

これを行うのは良い考えではないと言って、これに接頭辞を付けましょう。

ただし、シェルを生成し、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;
        }
      }
    });
  });

編集:実際には、これは実際の例の一部です。キーストロークをキャプチャしてサーバーに送信するクライアント側がありません。しかし、それはあなたに一般的な考えを与えるはずです。

4
Kyle Mueller