2013-10-24 21 views
16

ブラウザでFabrice BellardのLinuxシミュレーションについて読んだことがあります。ブラウザでLinux端末をシミュレートする

How does Linux emulator in Javascript by Fabrice Bellard work?

今日は、私は、彼らがNode.jsの上で自分のサイトを実行している知っているのperlなど、私のpythonを実行することです、彼らは、ブラウザで完全なLinuxターミナルをシミュレートしているこのサイトにつまずいたが、私端末を正確にシミュレートする方法を理解できませんでした。

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

+3

via ajax request ... firefox webconsoleを開こうとすると、一連のajaxリクエストを見ることができます:-) – Hellgorithm

答えて

21

完全なLinuxはhttp://docker.ioで、残りは私たちは、端末をシミュレートしていないhttps://github.com/Runnable/dockworker

ですが、カイルが言うように、(アヤックスフォールバック付き)WebSocketを介して端末を複製します。

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

+0

完璧です。私はこのようなものを探していました。 – 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

+0

この質問は4年前のものですが、私は実際にそれをやろうとしていますが、私は立ち往生しています...誰かがDockerターミナルをMeteorアプリに入れますか?私はhttps://github.com/mafintosh/docker-browser-consoleを創設しましたが、私はそれを私のために働かせることはできません。私は助けを感謝します – Jerome

4

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

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

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

関連する問題