Простая синтаксическая ошибка примера 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)
3 ответа
Он говорит вам, что какой-то объект, который вы пытаетесь вызвать отключение! метод на ноль. Так вот, этого кода нет в вашем примере, поэтому трудно сказать, почему это так, но я сильно сомневаюсь, что это ошибка в языке.
Это происходит в этом вызове метода, так что, возможно, вы можете опубликовать этот код?
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. Удаление неверного ключа решило проблему.