2009-10-28 26 views
3

我有一個問題,似乎非常片狀行爲,這是Ruby的問題還是我已經做了什麼?請幫助 - 我的項目停滯不前,直到我解決這個問題。簡單的紅寶石SFTP示例語法錯誤

鑑於這種代碼在Mac OS Leopard的運行:

require 'uri' 
require 'net/ssh' 
require 'net/sftp' 
include Net 

def copy_from_uri(uri, local_path) 
    # SFTP copy 
    SFTP.start(uri.host, uri.user, :password => 'password') do |sftp| 
     puts "downloading from #{uri.host}, path #{uri.path}\n" 
     sftp.download(uri.path, local_path) 
    end 
end 

remote_uri = URI.parse("sftp://example.com/test.mp4") 
local_file = "/tmp/remote_copy_test.mp4" 
result = copy_from_uri(remote_uri, local_file); 

什麼會導致下面的錯誤?

$ ruby sftp_fail.rb 
/Library/Ruby/Site/1.8/net/sftp.rb:43:in `start': undefined method `shutdown!' 
for nil:NilClass (NoMethodError) 
    from sftp_fail.rb:8:in `copy_from_uri' 
    from sftp_fail.rb:18 

FYI我設置RUBYOPT正確左右的寶石被加載和我的寶石均達到最新的,按照:

$gem list --local 
net-sftp (2.0.2, 1.1.0) 
net-ssh (2.0.15, 1.1.2) 

回答

3

這是告訴你一些對象,你正試圖調用關機!方法是零。現在,這個代碼不在你的例子中,所以很難說爲什麼會這樣,但我非常懷疑這是一種語言中的錯誤。

這是發生在這個方法調用,所以也許你可以發佈該代碼?

result = copy_from_uri(remote_uri, local_file); 

URI#解析應該永遠不會返回nil(它會拋出一個異常),因此如果可能的話,它將有助於查看該方法體。

+0

是的。 uri.user是零,因爲我忘記使用格式「sftp :: //[email protected]」。我花了一段時間才解決RUBYOPT問題,因此指責了一個內部問題。 – Justicle 2009-10-28 01:19:59

+0

所以......這就是答案,不是嗎? :) – 2009-10-28 01:56:54

+0

絕對是由於傳遞一個值爲零的問題,在我的情況下,我沒有更新我的變量到我的新格式@ip應該是@ host.name – 2009-11-07 07:55:26

1

我剛剛遇到了這個,但它是由另一個原因造成的。我的文件主機已經更改了他們的RSA密鑰,因此~/.ssh/known_hosts中的密鑰不正確---這導致了與所示相同的錯誤,從SSH過濾出來。刪除無效的密鑰解決了問題。

2

此錯誤實際上是由於net-sftp v2.0.2了一個錯誤:

def self.start(host, user, options={}, &block) 
    # ... 
rescue Object => anything 
    begin 
    session.shutdown! 
    rescue Exception 
    # swallow exceptions that occur while trying to shutdown 
    end 

    raise anything 
end 

當#START方法出現錯誤,它會嘗試關閉會話...但如果會議本身是零,這是將提高NoMethodErrorrescue Exception行試圖吞下所有異常,但實際上它正在救援Net::SFTP::Exception而不是根級別異常。這已經被最近修復(見this提交)。

升級到net-sftp 2.0.4,你將不會再遇到這個晦澀的錯誤。你仍然會得到一個錯誤,但是現在應該會更有幫助,原來的錯誤不會被救援塊中發生的新錯誤所拋棄。