質問

非常に不安定な動作のように見える問題がありますが、これは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

FYI RUBYOPTを正しく設定したため、gemがロードされ、gemが最新の状態になります。

$gem list --local
net-sftp (2.0.2, 1.1.0)
net-ssh (2.0.15, 1.1.2)
役に立ちましたか?

解決

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

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

result = copy_from_uri( remote_uri, local_file );

URI#parseは決してnilを返すべきではない(例外をスローする)ため、可能であればそのメソッド本体を確認するのに役立ちます。

他のヒント

このエラーは、実際には 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 。これは最近修正されました( this commit)。 >

net-sftp 2.0.4にアップグレードすると、このあいまいなエラーは発生しなくなります。それでもエラーは発生しますが、レスキューブロックで発生した新しいエラーによって元のエラーが破棄されないようになったので、さらに役立つはずです。

これに遭遇しましたが、別の理由が原因でした。私のファイルホストはRSAキーを変更していたため、〜/ .ssh / known_hosts のキーが正しくありませんでした。無効なキーを削除すると問題が解決しました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top