سؤال

ولدي مشكلة أن يبدو مثل behavour قشاري جدا، وهذا هو المشكلة مع روبي أو شيء قمت به؟ الرجاء المساعدة - وتوقفت مشروعي حتى يمكنني حل هذه

.

ونظرا لهذا الرمز الذي يعمل على نظام التشغيل Mac OS النمر:

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)
هل كانت مفيدة؟

المحلول

وأقول لك أن بعض وجوه التي تحاول استدعاء الاغلاق! على طريقة هو لا شيء. الآن، هذا الرمز ليس في المثال الخاص بك، ولذلك فمن الصعب أن نقول لماذا يمكن أن يكون، ولكن أشك بشدة هو وجود خطأ في اللغة.

ويجري في هذا استدعاء الأسلوب، لذلك ربما يمكنك إضافة هذا الرمز؟

result = copy_from_uri( remote_uri, local_file );

وURI # تحليل ينبغي أبدا أن يعود شيء (انه سيكون رمي استثناء)، لذلك من شأنه أن يساعد على رؤية أن الجسم الطريقة إذا كان ذلك ممكنا.

نصائح أخرى

وهذا الخطأ هو في الواقع نتيجة لخطأ في <لأ href = "http://github.com/net-ssh/net-sftp/blob/v2.0.2/lib/net/sftp.rb#L41-49 "يختلط =" نوفولو noreferrer "> صافي بالنشر 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، يحاول اغلاق الدورة ... ولكن إذا الجلسة نفسها هي لا شيء، وأنها سوف ترفع NoMethodError. يحاول خط rescue Exception لابتلاع كل استثناءات لكنها في الواقع انقاذ <لأ href = "http://github.com/net-ssh/net-sftp/blob/v2.0.2/lib/net/sftp/errors.rb# L4 "يختلط =" نوفولو noreferrer "> Net::SFTP::Exception بدلا من استثناء على مستوى الجذر. هذا وقد تم إصلاح مؤخرا (انظر هذا ارتكاب).

والترقية إلى صافي-بالنشر 2.0.4 وسوف لم يعد الحصول على هذا الخطأ غامضة. فأنت لا تزال تحصل على خطأ، لكن يجب أن يكون أكثر فائدة الآن أن لا يتم تجاهل الخطأ الأصلي هو خطأ جديد يحدث في كتلة الإنقاذ.

ولقد واجهت هذا فقط، ولكن كان سببه سبب آخر. وكان ملف مضيفي تغيرت مفتاح RSA، لذلك كان المفتاح في ~/.ssh/known_hosts غير صحيحة --- هذا أدى في نفس الخطأ كما هو موضح وتصفيتها حتى من SSH. حذف غير صالحة الرئيسية إصلاح المشكلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top