1

我正在尝试使用带有 ssh2 模块的 nodejs (v0.8.2) 从远程机器上获取一些文件(使用 sftp)。我可以使用密码或 rsa 密钥手动 ssh 到远程机器,但不知何故,以下代码无法产生成功的身份验证。关于可能出了什么问题的任何想法?

这是一个代码片段(我已经删除了执行 sftp 的代码以使其更容易理解——我在这里关心的是我无法进行身份验证。)

var express = require('express'),
    fs = require('fs'),
    Connection = require('ssh2');

var c = new Connection();
c.on('connect', function() {
  console.log('Connection :: connect');
});
c.on('ready', function() {
  console.log('Connection :: ready');
});
c.on('error', function(err) {
  console.log('Connection :: error :: ' + err);
});
c.on('end', function() {
  console.log('Connection :: end');
});
c.on('close', function(had_error) {
  console.log('Connection :: close');
});
c.on('keyboard-interactive', function() {
  console.log('Connection :: keyboard-interactive');
});
c.connect({
  host: '9.xx.yy.zzz',
  port: 22,
  username: 'my_username_on_remote_machine',
  password: 'my_password_on_remote_machine'
});

当我运行这段代码时,我得到一个“Connection :: connect”响应,但是直到 ssh 超时并且我得到 Connection :: end 和 Connection :: close 快速连续:

node testssh.js
Connection :: connect
Connection :: end
Connection :: close
4

2 回答 2

6

确保传递tryKeyboard: true,对事件的提示做一些有趣的keyboard-interactive事情,并使用包含这些提示答案的数组调用完成回调。

c.on('keyboard-interactive', function(name, instructions, instructionsLang, prompts, finish) {
  console.log('Connection :: keyboard-interactive');
  finish(['my_password_on_remote_machine']);
});

c.connect({
  host: '9.xx.yy.zzz',
  port: 22,
  username: 'my_username_on_remote_machine',
  tryKeyboard: true
});
于 2013-08-29T19:52:00.770 回答
3

确保您使用的是最新版本的 ssh2 模块并且您使用的是 node.js v0.8.7+。

如果在那之后您仍然遇到问题,您可以通过在传递给 connect(): 的对象中设置它来启用调试输出debug: console.log。希望这应该可以更好地了解幕后发生的事情。

于 2013-07-16T03:23:45.240 回答