2017-01-27 36 views
7

ð通过CLI与类似如下的命令成功,我已经成功地ssh”到谷歌云计算creds静静地失败:SSH2模块与CLI

ssh -i ~/.ssh/my-ssh-key [email protected] 

但使用ssh2模块没有给予任何输出,包括错误。

var fs = require('fs'); 
var Client = require('ssh2').Client; 

var connSettings = { 
    host: IP, // 'XXX.XXX.XXX.XX' 
    port: PORT, // XXXX 
    username: ME, 
    privateKey: privateKey, //fs.readFileSync(location, 'utf8') 
    passphrase: passphrase, 
    password: password 
}; 

var conn = new Client(); 

conn.on('ready', function() { //first example in README 
    console.log('Client :: ready'); 
    conn.exec('uptime', function(err, stream) { 
    if (err) throw err; //nothing 
    stream.on('close', function(code, signal) { 
     console.log('Stream :: close :: code: ' + code + ', signal: ' + signal); //nothing 
     conn.end(); 
    }).on('data', function(data) { 
     console.log('STDOUT: ' + data); //nothing 
    }).stderr.on('data', function(data) { 
     console.log('STDERR: ' + data); //nothing 
    }); 
    }); 
}) 
.on('error', function(err) { 
    console.error('err', error); //nothing 
}) 
.connect(connSettings); 

我尾矿/var/log/secure为我调试的节点剧本,我可以看到日志条目,当我在ssh和关闭从CLI会话,但什么都没有,当我通过节点ssh2尝试。

什么可能导致此连接默默失败?

+0

错误的端口,它正在等待握手超时?尝试添加'debug:console.log'到你的连接配置中,看看发生了什么/没有发生。 – mscdex

+0

@mscdex我可以看到,当我登录该对象,他们都是正确的。似乎应该至少有一些错误。 – 1252748

+0

你可以在其他地方发布调试输出吗?你使用的是什么版本的'ssh2'? – mscdex

回答

5

更新:我有它在您的客户端将登录服务器的ident字符串良好的权威,那就是在连接时立即发送。所以,如果你不要看到的信息,它必须是服务器没有发送任何东西的情况。 现在,由于您尝试使用CLI SSH并且它可以正常工作,所以一旦我们排除了不可能的情况,剩下的唯一解释就是您不在连接到同一个服务器/端口的。出于某种原因,目标服务器上的端口8080未运行SSH2服务器。

一个可能的解释是这样的:服务器运行的是8080端口一样,允许连接,但不发送任何东西最初(例如HTTP服务器)。当您使用CLI SSH进行连接时,您认为它使用的是端口8080,但由于某些原因ssh_config文件中的指令未启动,并且CLI SSH连接到真正的SSH服务器,并且工作正常节点SSH连接到不同的服务器,这就是为什么它不起作用。

要进行检查,尽量telnet'ting到该服务器的8080端口,并确认它确实有一个SSH2横幅回应:

Connected to xxx.xxx.xxx.xxx port 22 
Escape character is '^]'. 
SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.8 
^C 
Connection closed by foreign host. 

如果不回答与“SSH -... “横幅广告,我认为这足以证明CLI SSH连接到别处。哪里?要发现此情况,请再次运行带调试的CLI SSH:

ssh -vvv xxx.xxx.xxx.xxx ... 2>&1 | grep "Connecting to" 

(必须按Ctrl-C才能退出)。这应该给你:

debug1: Connecting to whatever [xxx.xxx.xxx.xxx] port XYZK 

这xxx.xxx.xxx.xxx和XYZK值是你需要传递给node客户的人。

以前的答案

我不熟悉nodejs的SSH2,但我有一个SSH2库(闭源,在那个)几个月前玩这种把戏确切我。 “连接...”后面没有什么

事实证明,客户端正在使用服务器不支持的密码,出于某种原因,OpenSSH2的CLI客户端显示此消息时,库选择不显示错误。深入到底是很麻烦的。

我从GitHub页面看到一些密码需要“node v0.11.12或更新”。这是你的情况吗?如果没有,你可能想尝试更新node

无论如何我会遵循@ AttRigh的建议并在调试模式下在服务器上运行sshd。如果您不能:

  • 日志SSH2 CLI客户端的全面调试模式输出,并提取什么加密器,它使用,
  • 建立与密码,没有别人sshd服务器,
  • 运行节点的客户对该服务器。

而且,现在我想起来了,你可能无论如何设置了sshd服务器使用默认设置,并确保您可以连接到该。这会限制这个问题。

+0

这个问题不是密码,因为握手开始时会有调试输出,就像OpenSSH客户端显示每个类别在每个类别中提供的内容(主机密钥格式​​,DH,密码,hmac,压缩)一样。事实上,ssh2客户端甚至没有看到服务器的标识字符串,因为它在连接之后实际上会记录它。 – mscdex

+0

@mscdex,我已经尝试过,并得出结论,您对端口8080不提供SSH2服务器的怀疑很可能是正确的。相应地更新了答案(我可能会最终完全删除它 - 这个问题可能在“简单错误”类别中并因此成为关闭的候选者)。 – LSerni

+0

@LSerni Telneting('telnet xxx.xxx.xxx.xxx 8080')给了我这个输出:'尝试xxx.xxx.xxx.xxx ... 连接到xx.xxx.xxx.xxx.bc.googleusercontent.com 。 转义字符是'^]''。我想我明白你在说什么,但我不确定如何解决它。你可以解释吗?谢谢。 – 1252748