NodeJS SSH2 не аутентифицируется с известным хостом

Я пытаюсь передать файлы с одного сервера на другой, используя SSH2 в NodeJS. Однако наши сетевые администраторы настроили закрытые ключи для авторизованного пользователя и, по сути, просто сделали возможным подключение к другому серверу через командную строку, например... $ ssh user@server2, и я могу подключиться без ввода пароля. Я знаю, что аутентификация предопределена в known_hosts, но я пытаюсь заставить это работать в nodejs.

Похоже, что в конфигурации SSH2 требуется либо privateKey, либо пароль. Кто-нибудь знает обходной путь для чего-то подобного? Или я просто делаю что-то не так? Единственный ключ, который я могу найти, находится в файле known_hosts, но, похоже, он имеет неправильный формат.

Вот с чем я работаю...

var Client = require('ssh2').Client;
 
var conn = new Client();
conn.on('ready', function() {
  console.log('Client :: ready');
  conn.exec('uptime', function(err, stream) {
    if (err) throw err;
    stream.on('close', function(code, signal) {
      console.log('Stream :: close :: code: ' + code + ', signal: ' + signal);
      conn.end();
    }).on('data', function(data) {
      console.log('STDOUT: ' + data);
    }).stderr.on('data', function(data) {
      console.log('STDERR: ' + data);
    });
  });
}).connect({
  host: '192.168.100.100',
  port: 22,
  username: 'frylock',
  privateKey: require('fs').readFileSync('/here/is/my/key')
});

//// Another Option I've tried  /////////////////////////////////////////

let Client = require('ssh2-sftp-client');
let sftp = new Client();

sftp.connect({
  host: 'server2',
  port: '22',
  username: 'username',
}).then(() => {
  return sftp.list('/pathname');
}).then(data => {
  console.log(data, 'the data info');
}).catch(err => {
  console.log(err, 'catch error');
});

/////////  


person TheJason    schedule 04.09.2019    source источник
comment
Если вы сделаете ssh -vvv user@server2, вы должны увидеть в выводе отладки, какая аутентификация используется, и если она основана на ключе, откуда извлекается ключ.   -  person mscdex    schedule 04.09.2019
comment
единственное место, где я могу увидеть ключ, находится в файле known_hosts. Это выглядит так... aliasName, ipAddress, ecdsa-sha2-nistp256 {строка шифрования}   -  person TheJason    schedule 04.09.2019
comment
Я запустил ssh -vvv, как вы сказали, и смог увидеть всю отладочную информацию. Он в основном скатывается по уровням, начиная с known_hosts, соответствует ключу там, а затем попадает в другие ключи в моем каталоге /.ssh/   -  person TheJason    schedule 04.09.2019
comment
Когда я пробую любой из ключей в отладке, я получаю следующую ошибку: Ошибка: не удается проанализировать privateKey: неподдерживаемый формат ключа   -  person TheJason    schedule 04.09.2019


Ответы (1)


При аутентификации на основе ключа ssh вам необходимо иметь доступ к ЧАСТНОМУ ключу. То, что находится в known_hosts, является открытым ключом. И SSH2, и ssh2-sftp-client будут работать с файлом закрытого ключа, но вам необходимо иметь доступ к этому файлу ключа, чтобы передать его. Пример того, как это сделать, приведен в репозиторий ssh2-sftp-client. (ssh2-sftp-client — это просто оболочка для ssh2, использующая тот же базовый метод подключения).

Поговорите со своими сетевыми администраторами и узнайте, как вы можете получить доступ к ключу или создать новую пару ключей и попросить их установить открытый ключ на sftp-сервере. Как только вы это сделаете, вы сможете сделать что-то вроде

let sftp = new Client();
sftp.connect({
  host: 'YOUR-HOST',
  port: 'YOUR-PORT',
  username: 'YOUR-USERNAME',
  privateKey: fs.readFileSync('/path/to/ssh/ke')
}).then(() => {
  sftp.fastPut(.....)
}
person Tim X    schedule 17.09.2019