Синтаксическая ошибка простого примера Ruby SFTP
Вопрос
У меня проблема, которая кажется очень странной, это проблема с 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)
Решение
Он говорит вам, что какой-то объект, который вы пытаетесь вызвать отключение! метод на ноль. Теперь этого кода нет в вашем примере, поэтому сложно сказать, почему это так, но я очень сомневаюсь, что это ошибка в языке.
Это происходит при вызове этого метода, поэтому, возможно, вы можете опубликовать этот код? Р>
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 возникает ошибка, он пытается завершить сеанс...но если сам сеанс равен нулю, он вызовет NoMethodError
.Тот Самый rescue Exception
строка пытается проглотить все исключения, но на самом деле это спасает Net::SFTP::Exception
вместо исключения корневого уровня.Это было недавно исправлено (см. это совершить).
Обновитесь до net-sftp 2.0.4, и вы больше не будете получать эту непонятную ошибку.Вы все равно получите сообщение об ошибке, но теперь это должно быть более полезно, поскольку исходная ошибка не отбрасывается новой ошибкой, возникающей в блоке восстановления.
Я только что столкнулся с этим, но это было вызвано другой причиной. Мой файловый хост изменил свой ключ RSA, поэтому ключ в ~ / .ssh / known_hosts
был неверным - это привело к той же ошибке, как показано, отфильтрованной по SSH. Удаление неверного ключа устранило проблему.