无法使用带有ssh2模块的nodejs进行身份验证,即使手动ssh有效

时间:2013-07-03 22:32:52

标签: javascript authentication ssh

我正在尝试将nodejs(v0.8.2)与ssh2模块一起使用来从远程计算机中获取一些文件(使用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

2 个答案:

答案 0 :(得分:5)

确保传递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
});

答案 1 :(得分:2)

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

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