Javascript 返回输入而不是命令输出的ssh2

Javascript 返回输入而不是命令输出的ssh2,javascript,node.js,Javascript,Node.js,我正在尝试创建一个连接到远程主机并允许运行正常终端命令的web终端。我可以连接到远程服务器和我的理解流。写入(数据)应该是触发命令在远程服务器上运行并返回输出的东西,但是我将输入返回到前端 term.html <!doctype html> <html> <head> <script src="http://code.jquery.com/jquery-latest.min.js"></script> <scr

我正在尝试创建一个连接到远程主机并允许运行正常终端命令的web终端。我可以连接到远程服务器和我的理解流。写入(数据)应该是触发命令在远程服务器上运行并返回输出的东西,但是我将输入返回到前端

term.html

<!doctype html>
<html>
  <head>
    <script src="http://code.jquery.com/jquery-latest.min.js"></script>
    <script src="/socket.io/socket.io.js" type="text/javascript" charset="utf-8"></script>
    <script type="text/javascript" charset="utf-8">
      var socket = io.connect('http://localhost:8080', {query: 'host=IP_Address&port=22&username=user&password=password'});

      // Display the resonse from the server
      function add_content(str){
        console.log(str);
        $('div').append('<p>' + $('<div/>').text(str).html() + '</p>');
        $(window).scrollTop($('body').height() - $(window).height() + 80);
      }

      // Backend -> Browser
      socket.on('server_data', function(data) {
          add_content(data);
      });

      // Disconnect message
      socket.on('disconnect', function() {
          add_content('\r\n*** Disconnected from backend***\r\n');
      });

      // Browser -> Backend
      $(function(){
        $('form').submit(function(e){
          e.preventDefault();
          var input = $('input');
          socket.emit('client_data', input.val());
          input.val('');
          return false;
        });
        $('input').focus();
      });
    </script> 

    <style type="text/css">
      body, p, input {
        font-family: fixed;
        font-size: 13px;
        border: none;
      }
      p { white-space: pre; }
      p, form, input { margin:0; padding:0; }
      input:focus { outline: none; border: none; }
    </style>
  </head>

  <body>
    <div></div>
    <form>
      &gt; <input>
    </form>
  </body>

</html>

@你能回答这个问题吗?你试过了吗?这就是你想要的东西吗?mcsdex-我确实探索过这个选项,但我对xterm不太满意(顺便说一下,你的例子很好)。我的希望是通过把所有的东西都带回来一步,看看socketio和ssh2自己能做些什么,来建立我对所有这些活动部件的理解。在ssh2中的shell如何实际运行命令并将输出传递回客户端方面,我似乎缺少了一些东西。任何有助于运行这个基本实现的帮助都会大大加深我的理解。谢谢您可能缺少输入/命令末尾的
\n
(模拟按下“回车”键),因为您使用的是交互式shell
.shell()
。试试:
stream.write(data+'\n')
就是这样!感谢您的帮助,感谢您在ssh2模块上所做的工作。@mscdex-您有机会回答这个问题吗?您试过了吗?这就是你想要的东西吗?mcsdex-我确实探索过这个选项,但我对xterm不太满意(顺便说一下,你的例子很好)。我的希望是通过把所有的东西都带回来一步,看看socketio和ssh2自己能做些什么,来建立我对所有这些活动部件的理解。在ssh2中的shell如何实际运行命令并将输出传递回客户端方面,我似乎缺少了一些东西。任何有助于运行这个基本实现的帮助都会大大加深我的理解。谢谢您可能缺少输入/命令末尾的
\n
(模拟按下“回车”键),因为您使用的是交互式shell
.shell()
。试试:
stream.write(data+'\n')
就是这样!感谢您的帮助,也感谢您在ssh2模块上所做的工作。
    var app = require('http').createServer(handler)
var io = require('socket.io')(app);
var fs = require('fs');
var SSHClient = require('ssh2').Client;

var listener = app.listen(8080);

var current_directory = null;


function handler (req, res) {
  fs.readFile(__dirname + '/term.html',
  function (err, data) {
    if (err) {
      res.writeHead(500);
      return res.end('Error loading term.html');
    }

    res.writeHead(200);
    res.end(data);
  });
}

io.on('connection', function(socket) {
  var conn = new SSHClient();
  conn.on('ready', function() {
    socket.emit('server_data', '\r\n*** SSH CONNECTION ESTABLISHED ***\r\n');
    conn.shell(function(err, stream) {
      if (err)
        return socket.emit('server_data', '\r\n*** SSH SHELL ERROR: ' + err.message + ' ***\r\n');
      socket.on('client_data', function(data) {
        stream.write(data);
      });
      stream.on('data', function(data) {
        socket.emit('server_data', data.toString('binary'));
        //console.log('STDOUT: ' + data);  
      }).stderr.on('data', function(data){
        //console.log('STDERR: ' + data);
        socket.emit('server_data', data.toString('binary'));
      }).on('close', function() {
        conn.end();
      });
    });
  }).on('close', function() {
    socket.emit('server_data', '\r\n*** SSH CONNECTION CLOSED ***\r\n');
  }).on('error', function(err) {
    socket.emit('server_data', '\r\n*** SSH CONNECTION ERROR: ' + err.message + ' ***\r\n');
  }).connect({
    host: socket.handshake.query.host,
    port: socket.handshake.query.port,
    username: socket.handshake.query.username,
    password: socket.handshake.query.password
  });
});