ssh2模块会以CLI的成功信号失败

我已经成功地通过CLI使用类似下面的命令进入Google Cloud Compute:

 ssh -i ~/.ssh/my-ssh-key me@ipnumber 

但是使用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中debugging节点脚本,我可以在ssh中看到日志条目,并从CLIclosures会话,但是当我尝试通过节点ssh2时什么都没有。

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

更新 :我有良好的权限,您的客户端将记录服务器标识字符串 ,并在连接后立即发送。 所以如果你没有看到这些信息,服务器就不会发送任何信息 。 现在,由于您尝试使用CLI SSH,并且它工作,一旦我们排除不可能,唯一剩下的解释,不太可能,因为它看起来是, 你没有连接到同一个服务器/端口 。 出于某种原因,目标服务器上的端口8080未运行SSH2服务器。

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

要检查,请尝试telnet到该服务器的端口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连接在别处。 哪里? 要发现这个问题,请使用debug再次运行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页面看到一些密码需要“节点v0.11.12或更新”。 这是你的情况吗? 如果没有,你可能想尝试更新node

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

  • 以完全调试模式记录ssh2 CLI客户端的输出并提取它使用的密码,
  • 用这个密码设置一个sshd服务器,而不是别人,
  • 针对该服务器运行您的节点客户端。

另外,现在我想到了,您可以使用默认设置来设置sshd服务器,并确保您可以连接到该服务器 。 这会限制这个问题。