Синтаксическая ошибка простого примера Ruby SFTP

StackOverflow https://stackoverflow.com/questions/1634646

  •  06-07-2019
  •  | 
  •  

Вопрос

У меня проблема, которая кажется очень странной, это проблема с 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. Удаление неверного ключа устранило проблему.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top