Connexion au serveur SSH distant (via la console Node.js / html5)

J’ai parcouru la canvas en cherchant à répondre à une question que je pensais simple. Mon objective est simple. Je veux créer un simple client SSH basé sur le Web en utilisant le ou les modules Node.js. J’ai trouvé plusieurs options si je veux me connecter au serveur de nœud lui-même, mais je n’arrive pas à trouver des exemples de connexion à un serveur REMOTE.

Essentiellement, le résultat que je recherche est un workflow comme celui-ci: Connect to webserver -> Cliquez sur un nom de serveur dans une liste de serveurs -> Entrez la session SSH sur le serveur sur lequel j’ai cliqué

La seule chose que j’ai trouvée qui est encore loin de ce que je recherche est la guacamole . Je ne veux cependant pas utiliser guacamole, car je souhaite que cette application soit indépendante du système d’exploitation. Actuellement, je le construis sur une plate-forme Windows 10, et je le porterai sur fedora lorsque j’aurai fini.

J’ai trouvé ce tutoriel pour créer un terminal SSH . Cependant, tout cela crée (ou tente de créer) une connexion SSH au système local.

Une autre option qui avait l’air absolument fantastique était tty.js. Hélas, le résultat final est le même que le tutoriel ci-dessus. Le module vous permet uniquement de vous connecter au serveur node.js, PAS aux serveurs distants.

Quelqu’un at-il des informations sur un chemin possible vers cet objective?

Ceci est facilement réalisable avec des modules comme ssh2 , xterm et socket.io .

Voici un exemple:

  1. npm install ssh2 xterm socket.io
  2. Créer index.html :
   SSH Terminal         
  1. Créez 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.toSsortingng('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. Modifier la configuration du serveur SSH passée à .connect() dans server.js
  2. node server.js
  3. Visitez http: // localhost: 8000 dans votre navigateur

Essayez aussi noVnc. Cependant, une petite recherche dans la page de xterm.js révèle d’autres solutions, comme

WebSSH2