-
-
Save omega/1069367 to your computer and use it in GitHub Desktop.
Node.js + Socket.io + Bash. A collaborative terminal for your browser - updated for socket.io 0.7
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// This server will start a bash shell and expose it | |
// over socket.io to a browser. See ./term.html for the | |
// client side. | |
// | |
// You should probably: | |
// | |
// npm install socket.io | |
// curl -O https://github.com/LearnBoost/Socket.IO/raw/master/socket.io.min.js | |
// | |
// To get socket.io in the node_modules directory and | |
// the socket.io.min.js file needed for the client. | |
// | |
// To start the server: | |
// | |
// node server.js | |
// | |
// And then load up your term! | |
// | |
// open http://`hostname`:8080/term.html | |
// | |
// You can even share the url with a friend on your | |
// local network. Be sure they're a friend though :-) | |
// | |
var http = require('http'), | |
url = require('url'), | |
path = require('path'), | |
fs = require('fs'), | |
io = require('socket.io'), | |
sys = require('sys'), | |
util = require('util'), | |
spawn = require('child_process').spawn; | |
var sh = spawn('bash'); | |
sh.stdout.on('data', function(data) { | |
listener.sockets.emit("stdout", data); | |
}); | |
sh.stderr.on('data', function(data) { | |
listener.sockets.emit("stderr", data); | |
}); | |
sh.on('exit', function (code) { | |
listener.sockets.emit("exit", '** Shell exited: '+code+' **'); | |
}); | |
server = http.createServer(function(request, response){ | |
var uri = url.parse(request.url).pathname; | |
var filename = path.join(process.cwd(), uri); | |
path.exists(filename, function(exists) { | |
if (!exists) { | |
response.writeHead(404, {'Content-Type':'text/plain'}); | |
response.end("Can''t find it..."); | |
} | |
fs.readFile(filename, 'binary',function(err, file){ | |
if (err) { | |
response.writeHead(500, {'Content-Type':'text/plain'}); | |
response.end(err + "\n"); | |
return; | |
} | |
response.writeHead(200); | |
response.write(file, 'binary'); | |
response.end(); | |
}); | |
}); | |
} | |
); | |
server.listen(8080); | |
var listener = io.listen(server); | |
listener.sockets.on('connection', function(client){ | |
client.on('message', function(data){ | |
sh.stdin.write(data+"\n"); | |
client.broadcast.send(new Buffer("> "+data)); | |
}); | |
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!doctype html> | |
<html> | |
<head> | |
<script src="http://code.jquery.com/jquery-latest.min.js"></script> | |
<script src="/socket.io/socket.io.js" type="text/javascript" charset="utf-8"></script> | |
<script type="text/javascript" charset="utf-8"> | |
function add_content(str){ | |
console.log(str); | |
$('div').append('<p>' + $('<div/>').text(str).html() + '</p>'); | |
$(window).scrollTop($('body').height() - $(window).height() + 80); | |
} | |
//var socket = new io.Socket(null, {rememberTransport: false, port: 8080}); | |
var socket = io.connect('/'); | |
socket.on('stdout', function(data) { | |
add_content($.map(data, function(e,i) { | |
return String.fromCharCode(e); | |
}).join('')); | |
}); | |
$(function(){ | |
$('form').submit(function(e){ | |
var input = $('input'); | |
socket.send(input.val()); | |
input.val(''); | |
return false; | |
}); | |
$('input').focus(); | |
}); | |
</script> | |
<style type="text/css"> | |
body, p, input { | |
font-family: fixed; | |
font-size: 13px; | |
border: none; | |
} | |
p { white-space: pre; } | |
p, form, input { margin:0; padding:0; } | |
input:focus { outline: none; border: none; } | |
</style> | |
</head> | |
<body> | |
<div></div> | |
<form> | |
> <input> | |
</form> | |
</body> | |
</html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Hi, (sorry for my poor English)
I'm tying to use your example, starting Server.js is good, but when i trying to connect term.html in a browser, this error appeared :
/var/www/socket/server.js:52
path.exists(filename, function(exists) {
^
TypeError: undefined is not a function
at Server. (/var/www/socket/server.js:52:10)
at Server. (/var/www/socket/node_modules/socket.io/node_modules/engine.io/lib/server.js:369:22)
at Server. (/var/www/socket/node_modules/socket.io/lib/index.js:258:16)
at Server.emit (events.js:110:17)
at HTTPParser.parserOnIncoming as onIncoming
at HTTPParser.parserOnHeadersComplete (_http_common.js:111:23)
at Socket.socketOnData (_http_server.js:343:22)
at Socket.emit (events.js:107:17)
at readableAddChunk (_stream_readable.js:163:16)
at Socket.Readable.push (_stream_readable.js:126:10)
Help please, i don't understand why
Thank's for your answers, i continue trying....
Krzysiu