web-dev-qa-db-ja.com

リモートのSSHサーバーへの接続(Node.js / html5コンソール経由)

私は簡単だと思っていた質問に答えようとしてウェブの顔を探していました。私の目標は簡単です。 Node.jsモジュールを使用して、シンプルなWebベースのSSHクライアントを構築します。ノードサーバー自体に接続したい場合、いくつかのオプションを見つけましたが、REMOTEサーバーへの接続の例を見つけることができないようです。

基本的に、私が探している結果は次のようなワークフローです:Webサーバーに接続->サーバーのリストでサーバー名をクリック->クリックしたサーバーへのSSHセッションを入力

私が探しているものに少しでも近いとわかった唯一のことは、 guacamole です。ただし、このアプリケーションをOSに依存しないようにしたいので、ワカモレは使いたくありません。現在、私はWindows 10プラットフォーム上で構築しており、完了したらFedoraに移植します。

SSHターミナルの作成 のこのチュートリアルを見つけました。ただし、これはすべて、ローカルシステムへのSSH接続を作成する(または作成を試みる)だけです。

絶対に素晴らしいと思われた別のオプションは tty.js でした。残念ながら、最終結果は上記のチュートリアルと同じです。モジュールでは、リモートサーバーではなく、node.jsサーバーにのみ接続できます。

誰もがこの目標への可能な経路に関する情報を持っていますか?

14
Ethan

これは _ssh2_xterm 、および _socket.io_ のようなモジュールで簡単に実行できます。

以下に例を示します。

  1. _npm install ssh2 xterm socket.io_
  2. _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. _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. _server.js_の.connect()に渡されるSSHサーバー構成を編集します
  2. _node server.js_
  3. ブラウザで http:// localhost:80 にアクセスします
33
mscdex

NoVncも試してください。ただし、xterm.jsのページ内の小さなDigは、次のような他のソリューションを明らかにします。

WebSSH2

1
giuseppe