Node.js 节点ssh2客户端中的重复数据输出

Node.js 节点ssh2客户端中的重复数据输出,node.js,ssh,ssh2,Node.js,Ssh,Ssh2,我有一个使用ssh2 npm模块和readline的简单Interactive ssh客户端。在每一行上,我都向服务器流发送数据,但由于某些原因,输入的命令也会发送数据 var Client = require('ssh2').Client; var readline = require('readline') var conn = new Client(); conn.on('ready', function() { console.log('Client :: ready'); c

我有一个使用ssh2 npm模块和readline的简单Interactive ssh客户端。在每一行上,我都向服务器流发送数据,但由于某些原因,输入的命令也会发送数据

var Client = require('ssh2').Client;
var readline = require('readline')

var conn = new Client();
conn.on('ready', function() {
  console.log('Client :: ready');
  conn.shell(function(err, stream) {
    if (err) throw err;
    // create readline interface
    var rl = readline.createInterface(process.stdin, process.stdout)

    stream.on('close', function() {
      process.stdout.write('Connection closed.')
      console.log('Stream :: close');
      conn.end();
    }).on('data', function(data) {
      // pause to prevent more data from coming in
      process.stdin.pause()
      process.stdout.write('DATA: ' + data)
      process.stdin.resume()
    }).stderr.on('data', function(data) {
      process.stderr.write(data);
    });

    rl.on('line', function (d) {
      // send data to through the client to the host
      stream.write(d.trim() + '\n')
    })

    rl.on('SIGINT', function () {
      // stop input
      process.stdin.pause()
      process.stdout.write('\nEnding session\n')
      rl.close()

      // close connection
      stream.end('exit\n')
    })

  });
}).connect({
        host: 'www58.lan',
        port: 22,
        username: 'gorod',
        password: '123qwe'
});
但输入的每个命令都是重复的。如何使它没有重复?谢谢大家!

输出:

gorod@www58:~$ ls
ls
temp.sql                       yo              sm_www94
a.out                          sm_dev1017      System Volume Information
dump20180801                   sm_qa1017       www58_sm_2310
dumps                          sm_www58
gorod@www58:~$
预期产出:

gorod@www58:~$ ls
temp.sql                       yo              sm_www94
a.out                          sm_dev1017      System Volume Information
dump20180801                   sm_qa1017       www58_sm_2310
dumps                          sm_www58
gorod@www58:~$

当前,
ssh2
不支持在为交互式shell会话设置伪TTY时传递终端模式(例如禁用远程终端回波),尽管
ssh2流
已经支持它

在将该功能添加到
ssh2
之前,至少有两种可能的解决方法:

  • 自动将
    'stty-echo\n'
    写入shell流一次。这将有效地执行与从get-go禁用远程终端echo相同的操作,但stty命令本身将被回显

  • 使用
    process.stdin.setRawMode(true)
    禁用本地回显并仅接收远程终端回显。但是,这有两个缺点:远程终端回显可能会延迟(造成混乱),并且您将无法通过
    'SIGINT'
    事件处理程序捕获ctrl-c(这可能是一项功能,因为它将透明地将ctrl-c分派到远程服务器,这在某些情况下非常有用)


  • 您的
    createInterface
    调用正在将stdin管道化到stdout。这就是你真正想要的吗?