web-dev-qa-db-fra.com

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

J'ai parcouru le Web en cherchant à répondre à une question que je pensais simple. Mon objectif est simple. Je souhaite créer un client SSH basé sur le Web simple à l’aide des modules Node.js. J'ai trouvé plusieurs options si je veux me connecter au serveur de noeud lui-même, mais je n'arrive pas à trouver d'exemples de connexion à un serveur REMOTE.

Le résultat recherché est essentiellement un flux de travail comme celui-ci: Se connecter au serveur Web -> Cliquez sur un nom de serveur dans une liste de serveurs -> Entrer une session SSH sur le serveur sur lequel j'ai cliqué

La seule chose que j'ai trouvée et qui se rapproche de ce que je cherche, c'est guacamole . Je ne souhaite cependant pas utiliser le 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 le portera sur Fedora lorsque j'aurai terminé. 

J'ai trouvé ce tutoriel pour créer un terminal SSH . Cependant, cela ne fait que créer (ou tenter de créer) une connexion SSH au système local. 

Une autre option qui semblait absolument fantastique était tty.js . Hélas, le résultat est le même que celui du 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 pour atteindre cet objectif?

10
Ethan

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

Voici un exemple:

  1. npm install ssh2 xterm socket.io
  2. Créer 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. Créer 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. Editez la configuration du serveur SSH transmise à .connect() dans server.js
  2. node server.js
  3. Visitez http: // localhost: 8000 dans votre navigateur
26
mscdex

Essayez aussi noVnc . Cependant, un petit Dig dans la page de xterm.js révèle d'autres solutions, comme

WebSSH2

0
giuseppe