2013-10-24 13 views
16

Ich habe über Linux-Simulation von Fabrice Bellard im Browser gelesen.Simulieren Linux Terminal im Browser

How does Linux emulator in Javascript by Fabrice Bellard work?

Heute habe ich auf diese Seite gestoßen, wo sie voll Linux-Terminal in Browser simulieren, ich in der Lage bin Python zu laufen, Perl usw. weiß, dass ich sie ihre Website auf node.js laufen, aber ich konnte nicht herausfinden, wie sie das Terminal genau simuliert.

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

+3

durch AJAX-Anfrage ... versuchen, Firefox-Webconsole zu öffnen, und Sie können eine Reihe von AJAX-Anfragen sehen :-) – Hellgorithm

Antwort

21

Der vollständige Linux ist http://docker.io, der Rest ist https://github.com/Runnable/dockworker

Wir sind nicht das Terminal simuliert, sondern als Kyle sagt, die Replikation der Terminal über WebSockets (mit Ajax-Rückfall).

Im Browser verwenden wir https://github.com/chjj/term.js, die von Fabrice Bellard-Emulator abgeleitet wurde. Es verarbeitet die Ausgabe und auch die Tasteneingabe.

+0

perfekt .. Ich war auf der Suche nach so etwas. – DevC

+2

Ich habe eine vereinfachte Version von nodschool.io Workshops: https://github.com/generalhenry/expose-bash-over-websockets https://github.com/generalhenry/nodesschool-interactive https://github.com/generalhenry/docker-gc https://github.com/generalhenry/nodeschool-dockerfiles – generalhenry

+0

Diese Frage ist vor 4 Jahren, aber ich versuche es tatsächlich und ich stecke ... Jemand hat eine Idee, wie ein Docker Terminal in eine Meteor App einbauen? Ich habe https://github.com/mafintosh/docker-browser-console gegründet, aber ich kann nicht dafür sorgen, dass es für mich funktioniert. Ich werde jede Hilfe schätzen – Jerome

4

Lassen Sie mich dieses Präfix sagen, es ist keine gute Idee ist, dies zu tun.

Aber Sie können eine Shell spawnen und Web-Sockets oder XMLHttpRequests verwenden, um Tastendrucke auf den erzeugten Server-Prozess zu drücken. Hier ist ein funktionierendes Beispiel für eines, das unter Windows läuft. Leider bin ich nicht dazu gekommen, Ctrl + c einzubinden/herauszufinden. Aber Sie sollten das Wesentliche davon bekommen.

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; 
     } 
     } 
    }); 
    }); 

Bearbeiten: Eigentlich ist dies ein Teil eines Arbeitsbeispiels. Es fehlt die Clientseite, auf der Sie die Tastenanschläge erfassen und an den Server senden. Aber es sollte dir die allgemeine Idee geben.

Verwandte Themen