如何在 Ruby 中修复 'no implicit conversion of Symbol into Hash'

How to fix 'no implicit conversion of Symbol into Hash' in Ruby

我刚开始学习 Ruby,我尝试制作一个简单的脚本来通过 ssh 连接到服务器。这是我的 class:

中的代码片段
require 'rubygems' if RUBY_VERSION < '1.9.0'
require 'sensu-plugin/check/cli'
gem 'net-ssh', '= 1.1.4'
require 'net/ssh'

class SshServer < Sensu::Plugin::Check::CLI

  option :host,
         short: '-h HOST',
         description: 'Server to ssh into',
         required: true

  def run
    puts "SSHing #{config[:host]} ..."
    Net::SSH.start(config[:host]) do |ssh|
      puts ssh.exec!('hostname')
      puts "Logging out..."
    end
end

我尝试输出 config[:host] 的值并对服务器名称进行硬编码,还有 config.get。没有运气。我正在使用 Ruby 版本 2.0.0.

这是完整的错误信息。抱歉,无法将其放入代码块中,因为它触发了 'too much code' 警告:

检查失败 运行:

no implicit conversion of Symbol into Hash, [
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/container.rb:141:in `merge'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/container.rb:141:in `register'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/definition-context.rb:123:in `method_missing'", 
"/u/user/.gem/ruby/gems/net-ssh-1.1.4/lib/net/ssh/transport/ossl/hmac/services.rb:30:in `block (2 levels) in register_services'", 
"/u/user/.gem/ruby/gems/net-ssh-1.1.4/lib/net/ssh/transport/ossl/hmac/services.rb:29:in `each'", 
"/u/user/.gem/ruby/gems/net-ssh-1.1.4/lib/net/ssh/transport/ossl/hmac/services.rb:29:in `block in register_services'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/container.rb:107:in `define'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/container.rb:250:in `block in namespace_define'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/container.rb:177:in `call'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/container.rb:177:in `block in namespace'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/lifecycle/singleton.rb:42:in `call'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/lifecycle/singleton.rb:42:in `block in call'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/lifecycle/singleton.rb:40:in `synchronize'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/lifecycle/singleton.rb:40:in `call'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/service-point.rb:122:in `instance'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/container.rb:308:in `get'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/container.rb:251:in `namespace_define'", 
"/u/user/.gem/ruby/gems/net-ssh-1.1.4/lib/net/ssh/transport/ossl/hmac/services.rb:26:in `register_services'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/container.rb:365:in `require'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/definition-context.rb:77:in `require'", 
"/u/user/.gem/ruby/gems/net-ssh-1.1.4/lib/net/ssh/transport/ossl/services.rb:34:in `block in register_services'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/container.rb:107:in `define'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/container.rb:250:in `block in namespace_define'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/container.rb:177:in `call'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/container.rb:177:in `block in namespace'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/lifecycle/singleton.rb:42:in `call'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/lifecycle/singleton.rb:42:in `block in call'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/lifecycle/singleton.rb:40:in `synchronize'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/lifecycle/singleton.rb:40:in `call'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/service-point.rb:122:in `instance'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/container.rb:308:in `get'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/container.rb:251:in `namespace_define'", 
"/u/user/.gem/ruby/gems/net-ssh-1.1.4/lib/net/ssh/transport/ossl/services.rb:30:in `register_services'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/container.rb:365:in `require'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/definition-context.rb:77:in `require'", 
"/u/user/.gem/ruby/gems/net-ssh-1.1.4/lib/net/ssh/transport/services.rb:137:in `block in register_services'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/container.rb:107:in `define'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/container.rb:250:in `block in namespace_define'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/container.rb:177:in `call'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/container.rb:177:in `block in namespace'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/lifecycle/singleton.rb:42:in `call'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/lifecycle/singleton.rb:42:in `block in call'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/lifecycle/singleton.rb:40:in `synchronize'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/lifecycle/singleton.rb:40:in `call'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/service-point.rb:122:in `instance'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/container.rb:308:in `get'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/container.rb:251:in `namespace_define'", 
"/u/user/.gem/ruby/gems/net-ssh-1.1.4/lib/net/ssh/transport/services.rb:23:in `register_services'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/container.rb:365:in `require'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/definition-context.rb:77:in `require'", 
"/u/user/.gem/ruby/gems/net-ssh-1.1.4/lib/net/ssh/session.rb:126:in `block in initialize'", 
"/u/user/.gem/ruby/gems/needle-1.3.0/lib/needle/container.rb:107:in `define'", 
"/u/user/.gem/ruby/gems/net-ssh-1.1.4/lib/net/ssh/session.rb:106:in `initialize'", 
"/u/user/.gem/ruby/gems/net-ssh-1.1.4/lib/net/ssh.rb:47:in `new'", 
"/u/user/.gem/ruby/gems/net-ssh-1.1.4/lib/net/ssh.rb:47:in `start'", "check-directory-exists.rb:59:in `run'", 
"/u/user/.gem/ruby/gems/sensu-plugin-1.4.7/lib/sensu-plugin/cli.rb:58:in `block in <class:CLI>'"
]

已更新

我找到了与您的 ruby 版本兼容的版本。我用 ruby 版本

测试了这个

ruby 2.0.0p648 (2015-12-16 revision 53162) [x86_64-darwin18.2.0]

该版本后跟:

gem install net-ssh --version 3.0.2

我能够让我的代码在没有你的错误的情况下工作。

原回答

问题似乎出在旧版本 net-ssh 上没有错误。我也用过这种格式:

def run
  puts "SSHing #{config[:host]} ..."
  Net::SSH.start( config[:host],
                  :password=> 'password',
                  :port=> 22,
                  :username=> 'username') do |ssh|

    puts ssh.exec!('hostname')
    puts "Logging out..."
  end
end