3

我有一个看起来很不稳定的问题,这是 Ruby 的问题还是我做过的事情?请帮忙 - 我的项目在我解决这个问题之前一直停滞不前。

鉴于此代码在 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

仅供参考,我已正确设置 RUBYOPT,以便加载宝石并且我的宝石是最新的,根据:

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

3 回答 3

3

它告诉您您试图调用关闭的某些对象!方法 on 为零。现在,该代码不在您的示例中,因此很难说为什么会这样,但我高度怀疑这是语言中的错误。

它发生在此方法调用中,所以也许您可以发布该代码?

result = copy_from_uri( remote_uri, local_file );

URI#parse 永远不应返回 nil(它会抛出异常),因此如果可能的话,查看该方法体会有所帮助。

于 2009-10-28T01:13:50.173 回答
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 方法中发生错误时,它会尝试关闭会话……但如果会话本身为 nil,它将引发NoMethodError. 该rescue Exception行试图吞下所有异常,但它实际上是在拯救Net::SFTP::Exception而不是根级异常。最近已修复此问题(请参阅提交)。

升级到 net-sftp 2.0.4,您将不会再收到这个晦涩的错误。您仍然会收到一个错误,但现在应该更有帮助,因为救援块中发生的新错误不会丢弃原始错误。

于 2010-01-02T02:03:21.287 回答
1

我刚遇到这种情况,但它是由另一个原因引起的。我的文件主机更改了他们的 RSA 密钥,因此输入的密钥~/.ssh/known_hosts不正确 --- 这导致了与所示相同的错误,从 SSH 过滤。删除无效密钥解决了问题。

于 2009-11-24T20:37:56.887 回答