3

非常に不安定な動作のように見える問題がありますが、これはRubyの問題ですか、それとも私が行ったことの問題ですか?助けてください-私がこれを解決するまで私のプロジェクトは行き詰まっています。

このコードがMacOSLeopardで実行されているとすると、次のようになります。

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が読み込まれ、gemが最新になります。

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

3 に答える 3

3

シャットダウンと呼ぼうとしているオブジェクトがあることを示しています。onのメソッドはnilです。さて、そのコードはあなたの例にはないので、なぜそうなるのかを言うのは難しいですが、それが言語のバグであるとは非常に疑わしいです。

これはこのメソッド呼び出しで発生しているので、おそらくそのコードを投稿できますか?

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 に答える