npm install
npm startGo to http://localhost:8080/.
npm install
npm startGo to http://localhost:8080/.
| <!doctype html> | |
| <html> | |
| <head> | |
| <title>SSH Client</title> | |
| <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.5/socket.io.min.js"></script> | |
| <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> | |
| <style> | |
| body { | |
| margin: 0; | |
| padding: 0; | |
| } | |
| .terminal { | |
| font-family: monospace; | |
| color: white; | |
| background: black; | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <h1>SSH</h1> | |
| <div class="terminal"> | |
| </div> | |
| <script> | |
| // Connect to the socket.io server | |
| var socket = io.connect('http://localhost:8080'); | |
| // Wait for data from the server | |
| socket.on('output', function (data) { | |
| // Insert some line breaks where they belong | |
| data = data.replace("\n", "<br>"); | |
| data = data.replace("\r", "<br>"); | |
| // Append the data to our terminal | |
| $('.terminal').append(data); | |
| }); | |
| // Listen for user input and pass it to the server | |
| $(document).on("keypress",function(e){ | |
| var char = ""; | |
| char = String.fromCharCode(e.which); | |
| socket.emit("input", char); | |
| }); | |
| </script> | |
| </body> | |
| </html> | 
| { | |
| "name": "WebSSH", | |
| "version": "1.0.0", | |
| "description": "", | |
| "main": "server.js", | |
| "dependencies": { | |
| "express": "^4.12.3", | |
| "pty.js": "^0.2.7-1", | |
| "socket.io": "^1.3.5" | |
| }, | |
| "devDependencies": {}, | |
| "scripts": { | |
| "start": "node server.js" | |
| }, | |
| "author": "Jakub Mandula<[email protected]", | |
| "license": "MIT" | |
| } | 
| var express = require('express'); | |
| var https = require('https'); | |
| var http = require('http'); | |
| var fs = require('fs'); | |
| var pty = require('pty.js'); | |
| // Setup the express app | |
| var app = express(); | |
| // HTTPS key and certificate files | |
| var options = { | |
| key: fs.readFileSync('keys/key.pem'), | |
| cert: fs.readFileSync('keys/cert.pem') | |
| }; | |
| // Create Server using the app and bind it to a port | |
| //https.createServer(options, app).listen(4000) | |
| var server = http.createServer(app).listen(8080); | |
| // Static file serving | |
| app.use("/",express.static("./")); | |
| // Bind socket.io to the server | |
| var io = require('socket.io')(server); | |
| // When a new socket connects | |
| io.on('connection', function(socket){ | |
| // Create terminal | |
| var term = pty.spawn('sh', [], { | |
| name: 'xterm-color', | |
| cols: 80, | |
| rows: 30, | |
| cwd: process.env.HOME, | |
| env: process.env | |
| }); | |
| // Listen on the terminal for output and send it to the client | |
| term.on('data', function(data){ | |
| socket.emit('output', data); | |
| }); | |
| // Listen on the client and send any input to the terminal | |
| socket.on('input', function(data){ | |
| term.write(data); | |
| }); | |
| // Listen for a resize request and update the terminal size | |
| socket.on('resize', function(data){ | |
| term.resize(data[0], data[1]); | |
| }); | |
| // When socket disconnects, destroy the terminal | |
| socket.on("disconnect", function(){ | |
| term.destroy(); | |
| console.log("bye"); | |
| }); | |
| }); |