2013-08-28 34 views
0

參考net-ssh API,傳遞來自yaml的連接參數的「最佳」方式是什麼?ssh參數錯誤

錯誤:

[email protected]:~/ruby$ 
[email protected]:~/ruby$ ruby ssh.rb 
{:host=>"localhost", :user=>"me", :port=>123, :password=>"mypassword"} 
/home/thufir/.rvm/gems/ruby-2.0.0-p247/gems/net-ssh-2.6.8/lib/net/ssh.rb:165:in `start': wrong number of arguments (1 for 2..3) (ArgumentError) 
    from ssh.rb:14:in `<main>' 
[email protected]:~/ruby$ 

代碼:

#!/usr/bin/env ruby 
require 'rubygems' 
require 'net/ssh' 
require 'yaml' 
require 'pry' 

conn = YAML.load_file('conn.yml') 

params = {:host => conn['host'], :user => conn['user'], 
      :port => conn['port'],:password => conn['password']} 

puts params 

Net::SSH.start(params) do |ssh| 
    puts 'hi' 
end 

YAML:

user: me 
password: mypassword 
port: 123 
host: localhost 

是有可能只是通過一個單片對象?或者,你是否必須將其分解成主機,用戶等。人?

回答

4

hostuser參數必須指定爲位置參數,而不是作爲options散列的一部分。因此:

Net::SSH.start(conn['host'], conn['user'], port: conn['port'], password: conn['password']) do |ssh| 
    # ... 
end 

或者,你可以通過所有的YAML鍵值直接對:

Net::SSH.start(conn.delete('host'), conn.delete('user'), conn) do |ssh| 
    # ... 
end 
+0

這是野生的,不知道你可以通過原像YAML的鍵值對!我無法真正測試它,因爲我不認爲我的服務器允許ssh,但這非常有趣。如果你可以把它作爲一個散列來傳遞,它不會是一個更好的API嗎?似乎很奇怪,這些立場的論點。 – Thufir