1

我正在尝试使用 NodeJS 中的 SSH2 将文件从一台服务器传输到另一台服务器。但是,我们的网络管理员已经为授权用户设置了私钥,并且基本上可以通过命令行连接到其他服务器,就像这样...... $ 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');
});

/////////  

4

1 回答 1

1

使用基于 ssh 密钥的身份验证,您需要有权访问 PRIVATE 密钥。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(.....)
}
于 2019-09-17T09:22:25.690 回答