Connecting to a remote SSH server (via Node.js / html5 console)

I am combing the face of the Internet to answer a question that I thought would be simple. My goal is simple. I want to create a simple SSH web client using Node.js module (s). I found several options if I want to connect to the node server itself, but cannot find examples of connecting to the REMOTE server.

Essentially, the result I'm looking for is a workflow like this: Connect to a web server → Click on the server name in the server list → Enter the SSH session on the server I clicked on

The only thing I found is that even remotely close to what I'm looking for, guacamole . However, I do not want to use guacamole as I want this application to be OS independent. I am currently creating it on the Windows 10 platform and will submit it to Fedora when done.

I found this tutorial for creating an SSH terminal . However, all this creates (or tries to create) an SSH connection to the local system.

Other options that looked absolutely fantastic were tty.js. Alas, the bottom line is the same as in the above tutorial. The module allows you to connect only to the Node.js server, and not to remote servers.

Does anyone have information on a possible path to this goal?

+6
source share
2 answers

This is easily done with modules like ssh2 , xterm and socket.io .

Here is an example:

  • npm install ssh2 xterm socket.io
  • Create index.html :
 <html> <head> <title>SSH Terminal</title> <link rel="stylesheet" href="/src/xterm.css" /> <script src="/src/xterm.js"></script> <script src="/addons/fit/fit.js"></script> <script src="/socket.io/socket.io.js"></script> <script> window.addEventListener('load', function() { var terminalContainer = document.getElementById('terminal-container'); var term = new Terminal({ cursorBlink: true }); term.open(terminalContainer); term.fit(); var socket = io.connect(); socket.on('connect', function() { term.write('\r\n*** Connected to backend***\r\n'); // Browser -> Backend term.on('data', function(data) { socket.emit('data', data); }); // Backend -> Browser socket.on('data', function(data) { term.write(data); }); socket.on('disconnect', function() { term.write('\r\n*** Disconnected from backend***\r\n'); }); }); }, false); </script> <style> body { font-family: helvetica, sans-serif, arial; font-size: 1em; color: #111; } h1 { text-align: center; } #terminal-container { width: 960px; height: 600px; margin: 0 auto; padding: 2px; } #terminal-container .terminal { background-color: #111; color: #fafafa; padding: 2px; } #terminal-container .terminal:focus .terminal-cursor { background-color: #fafafa; } </style> </head> <body> <div id="terminal-container"></div> </body> </html> 
  1. Create server.js :
 var fs = require('fs'); var path = require('path'); var server = require('http').createServer(onRequest); var io = require('socket.io')(server); var SSHClient = require('ssh2').Client; // Load static files into memory var staticFiles = {}; var basePath = path.join(require.resolve('xterm'), '..'); [ 'addons/fit/fit.js', 'src/xterm.css', 'src/xterm.js' ].forEach(function(f) { staticFiles['/' + f] = fs.readFileSync(path.join(basePath, f)); }); staticFiles['/'] = fs.readFileSync('index.html'); // Handle static file serving function onRequest(req, res) { var file; if (req.method === 'GET' && (file = staticFiles[req.url])) { res.writeHead(200, { 'Content-Type': 'text/' + (/css$/.test(req.url) ? 'css' : (/js$/.test(req.url) ? 'javascript' : 'html')) }); return res.end(file); } res.writeHead(404); res.end(); } io.on('connection', function(socket) { var conn = new SSHClient(); conn.on('ready', function() { socket.emit('data', '\r\n*** SSH CONNECTION ESTABLISHED ***\r\n'); conn.shell(function(err, stream) { if (err) return socket.emit('data', '\r\n*** SSH SHELL ERROR: ' + err.message + ' ***\r\n'); socket.on('data', function(data) { stream.write(data); }); stream.on('data', function(d) { socket.emit('data', d.toString('binary')); }).on('close', function() { conn.end(); }); }); }).on('close', function() { socket.emit('data', '\r\n*** SSH CONNECTION CLOSED ***\r\n'); }).on('error', function(err) { socket.emit('data', '\r\n*** SSH CONNECTION ERROR: ' + err.message + ' ***\r\n'); }).connect({ host: '192.168.100.105', username: 'foo', password: 'barbaz' }); }); server.listen(8000); 
  1. Edit the SSH server configuration passed to .connect() in server.js
  2. node server.js
  3. Visit http: // localhost: 8000 in your browser
+18
source

Try also noVnc. However, digging a little on the xterm.js page, you will see other solutions, for example

Webssh2

0
source

All Articles