2016-08-01 16 views
6

Przeszukałem twarz sieci, szukając odpowiedzi na pytanie, które uważałem za proste. Mój cel jest prosty. Chcę zbudować prostego internetowego klienta SSH przy użyciu modułu (ów) Node.js. Znalazłem kilka opcji, jeśli chcę połączyć się z samym serwerem węzła, ale nie mogę znaleźć żadnych przykładów połączenia z serwerem REMOTE.Łączenie ze zdalnym serwerem SSH (przez Node.js/konsolę html5)

Zasadniczo wynik szukam jest workflow tak: Podłącz do serwera WWW -> Kliknij na nazwę serwera na liście serwerów -> Enter sesji SSH do serwera Kliknąłem na

Jedyną rzeczą Odkryłem, że jest to nawet zdalnie zbliżone do tego, czego szukam, to guacamole. Nie chcę jednak używać guacamole, ponieważ chcę, aby ta aplikacja była niezależna od systemu operacyjnego. Obecnie buduję go na platformie Windows 10, a kiedy skończę, przeniesię go do Fedory.

Znalazłem ten samouczek dla creating an SSH terminal. Jednak wszystko to tworzy (lub próbuje utworzyć) połączenie SSH z systemem lokalnym.

Kolejne opcje, które wyglądały absolutnie fantastycznie, to tty.js. Niestety, dolna linia jest taka sama, jak w powyższym samouczku. Moduł pozwala tylko na łączenie się z serwerem node.js, NIE z serwerami zdalnymi.

Ktoś ma informacje na temat możliwej ścieżki do tego celu?

Odpowiedz

18

Jest to łatwe do zrealizowania dzięki modułom takim jak ssh2, xterm i socket.io.

Oto przykład:

  1. npm install ssh2 xterm socket.io
  2. Tworzenie 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. Tworzenie 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 konfiguracja serwera SSH przekazane .connect() w server.js
  2. node server.js
  3. Wizyta http://localhost:8000 w przeglądarce
+1

Koleś, jesteś absolutnie rock! :) – Ethan

+1

Czy nie ma czegoś podobnego do RDP i VNC do you? :) – Ethan

+0

Pojawia się szybkie wyszukiwanie vnc [this] (http://blog.mgechev.com/2013/08/30/vnc-javascript-nodejs/). Jest trochę stary i może zostać zoptymalizowany, ale może nadal działać. Jeśli chodzi o PROW, nie widziałem jeszcze implementacji/wiązania RDP dla węzła. – mscdex

0

Spróbuj również noVnc. jednak trochę kopać w stronie xterm.js ujawnia inne rozwiązania, jak

WebSSH2