连接到远程SSH服务器(通过Node.js / html5控制台)

晚上好,

我一直在搜寻networking的面孔,想要回答一个我认为简单的问题。 我的目标很简单。 我想用Node.js模块构build一个简单的基于Web的SSH客户端。 如果我想连接到节点服务器本身,我发现了几个选项,但似乎找不到连接到REMOTE服务器的任何示例。

基本上,我正在寻找的结果是这样一个工作stream程:连接到networking服务器 – >点击服务器列表中的服务器名称 – >input服务器的SSH会话我点击

我发现的唯一东西,即使是远离我正在寻找的是鳄梨酱 。 我不想使用鳄梨酱,但是,因为我希望这个应用程序独立于操作系统。 目前我在Windows 10平台上构build它,当我完成后将它移植到fedora。

我发现这个教程创build一个SSHterminal 。 但是,所有这些都会创build(或尝试创build)到本地系统的SSH连接。

看起来非常棒的另一个select是tty.js。 唉,底线和上面的教程是一样的。 该模块只允许您连接到node.js服务器,而不是连接到远程服务器。

任何人都有可能通向这个目标的信息?

这很容易用ssh2xtermsocket.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.addEventlistner('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:8000

也尝试noVnc。 但是,在xterm.js的页面中稍微挖掘一下, xterm.js发现其他的解决方案

WebSSH2