дублирование вывода данных в узле клиента ssh2 - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть простой интерактивный ssh-клиент, использующий модуль ssh2 npm и readline.На каждой строке я отправляю данные в поток сервера, но по какой-то причине введенная команда тоже отправляет

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:~$

1 Ответ

0 голосов
/ 11 декабря 2018

В настоящее время ssh2 не поддерживает передачу режимов терминала (например, отключение эхо-сигнала удаленного терминала) при настройке псевдо-TTY для сеанса интерактивной оболочки, хотя ssh2-streams уже поддерживает его.

Пока эта функция не добавлена ​​в ssh2, существует как минимум два возможных обходных пути:

  1. Автоматическая запись 'stty -echo\n' один раз в поток оболочки.Это фактически сделает то же самое, что отключение эхо удаленного терминала с самого начала, за исключением того, что сама команда stty будет отображена.

  2. Используйте process.stdin.setRawMode(true), чтобы отключить локальное эхо иполучить только удаленный терминал эхо.Однако у этого есть два недостатка: эхо удаленного терминала может быть отложено (что приводит к путанице), и вы не сможете перехватить ctrl-c с помощью обработчика событий 'SIGINT' (это потенциально может быть функцией, поскольку она будет прозрачно отправлять ctrl-c вместо удаленного сервера, что может быть полезно в некоторых ситуациях).

...