如何在 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
我刚开始学习 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