ssh2模块以静默方式失败,并通过CLI获得成功



我已经通过CLI成功地将d_1'dssh'd放入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,当我ssh进入并从CLI关闭会话时,我可以看到日志条目,但当我尝试通过节点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页面看到,一些密码需要"node v0.11.12或更新版本"。这是你的案子吗?如果没有,您可能需要尝试更新node

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

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

此外,现在我想起来了,你可以用默认设置设置一个sshd服务器,并确保你可以连接到。这在一定程度上限制了这个问题。

最新更新