我已经使用如下命令通过 CLI 成功 ssh 进入 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,因为我正在调试 Node 脚本,当我 ssh 进入并关闭 session 时,我可以看到日志条目CLI,但是当我尝试通过 Node ssh2 时什么也没有。
什么可能导致此连接无提示地失败?
最佳答案
更新:据我所知,您的客户端将记录服务器标识字符串,并在连接后立即发送。因此,如果您没有看到该信息,则一定是服务器没有发送任何内容。 现在,由于您尝试使用 CLI SSH 并且它有效,一旦我们排除了不可能的情况,唯一剩下的解释(看起来不太可能)是您没有连接到同一服务器/端口。由于某种原因,目标服务器上的端口 8080 未运行 SSH2 服务器。
一个 可能的解释是:服务器正在端口 8080 上运行其他东西,允许连接但最初不发送任何东西(例如 HTTP 服务器)。当您使用 CLI SSH 连接时,您认为它正在使用端口 8080,但出于某种原因,ssh_config 文件中的指令没有启动,并且 CLI SSH 连接到真正的 SSH 服务器,并工作,而 Node SSH 连接到不同的服务器,这就是它不工作的原因。
要检查,请尝试远程登录到该服务器的端口 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 库(当时是封闭源)对我玩这个把戏。 “已连接...”后跟 nothing。
事实证明,客户端使用的是服务器不支持的密码,出于某种原因,虽然 OpenSSH2 的 CLI 客户端显示了这一点,但库选择不显示错误。追根究底非常麻烦。
我从 GitHub 页面上看到一些密码需要“Node v0.11.12 或更新版本”。这是你的情况吗?如果没有,您可能想尝试更新 node。
在任何情况下,我都会遵循@AttRigh 的建议并在服务器上以 Debug模式运行 sshd。如果你不能:
此外,既然我想到了,您无论如何都可以使用默认设置设置一个 sshd 服务器,并确保您可以连接到那个。这会在某种程度上限制问题。
关于javascript - ssh2 模块静默失败,凭据从 CLI 成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41885978/
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我尝试使用不同的ssh_options在同一阶段运行capistranov.3任务。我的production.rb说:set:stage,:productionset:user,'deploy'set:ssh_options,{user:'deploy'}通过此配置,capistrano与用户deploy连接,这对于其余的任务是正确的。但是我需要将它连接到服务器中配置良好的an_other_user以完成一项特定任务。然后我的食谱说:...taskswithoriginaluser...task:my_task_with_an_other_userdoset:user,'an_othe
我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r
我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c
我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的
我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co