ssh2模块使用从CLI成功的信用卡静默失败

125*_*748 6 javascript linux ssh node.js google-cloud-platform

我已ssh通过CLI 成功进入Google Cloud Compute,其命令如下:

ssh -i ~/.ssh/my-ssh-key me@ipnumber
Run Code Online (Sandbox Code Playgroud)

但是使用该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);
Run Code Online (Sandbox Code Playgroud)

/var/log/secure当我正在调试节点脚本时我正在拖尾,当我ssh进入并从CLI关闭会话时我可以看到日志条目,但是当我尝试通过节点时什么也没有ssh2.

什么可能导致此连接无声地失败?

LSe*_*rni 5

更新:我有良好的权限,您的客户端将记录服务器标识字符串,并在连接后立即发送.因此,如果您没有看到该信息,则必须是服务器未发送任何内容的情况.现在,既然您尝试使用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.
Run Code Online (Sandbox Code Playgroud)

如果它没有回答 "SSH -..."横幅,我认为这足以证明CLI SSH正在连接其他地方.哪里?要发现这一点,请再次运行带有debug的CLI SSH:

ssh -vvv xxx.xxx.xxx.xxx ... 2>&1 | grep "Connecting to"
Run Code Online (Sandbox Code Playgroud)

(您必须通过按Ctrl-C退出).这应该给你:

debug1: Connecting to whatever [xxx.xxx.xxx.xxx] port XYZK
Run Code Online (Sandbox Code Playgroud)

并且xxx.xxx.xxx.xxx和XYZK值是您需要传递给node客户端的值.

以前的答案

我不熟悉nodejsSSH2,但我有一个SSH2库(闭源,就在那个)几个月前向我发挥这个诀窍."连接......"后面没有任何内容.

事实证明,客户端使用的是服务器不支持的密码,由于某些原因,OpenSSH2的CLI客户端显示了该密码,因此该库选择不显示错误.深入了解事情是非常混乱的.

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

在任何情况下,我都会遵循@AttRigh的建议,并在调试模式下在服务器上运行sshd.如果你不能:

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

此外,现在我开始考虑它,您可以使用默认设置设置sshd服务器,并确保您可以连接到该服务器.这会在一定程度上限制问题.