Ruby net/sftp удаленно читает файл и сохраняет в базу данных, получает ошибку StatusException (4, сбой)

Я пытаюсь загрузить xmls с удаленного сайта sftp, прочитать содержимое файла в REXML и сохранить данные в БД. пока код готов к чтению файла, а строка f.gets завершается с ошибкой:

/usr/local/lib/ruby/gems/1.9.1/gems/net-sftp-2.0.5/lib/net/sftp/session.rb:846:in `wait_for': Net::SFTP::StatusException (4, "failure") (Net::SFTP::StatusException)
        from /usr/local/lib/ruby/gems/1.9.1/gems/net-sftp-2.0.5/lib/net/sftp/session.rb:257:in `read!'
        from /usr/local/lib/ruby/gems/1.9.1/gems/net-sftp-2.0.5/lib/net/sftp/operations/file.rb:162:in `fill'
        from /usr/local/lib/ruby/gems/1.9.1/gems/net-sftp-2.0.5/lib/net/sftp/operations/file.rb:100:in `block in gets'
        from /usr/local/lib/ruby/gems/1.9.1/gems/net-sftp-2.0.5/lib/net/sftp/operations/file.rb:93:in `loop'
        from /usr/local/lib/ruby/gems/1.9.1/gems/net-sftp-2.0.5/lib/net/sftp/operations/file.rb:93:in `gets'
        from ./test.rb:10:in `block (3 levels) in <main>'
        from /usr/local/lib/ruby/gems/1.9.1/gems/net-sftp-2.0.5/lib/net/sftp/operations/file_factory.rb:45:in `open'
        from ./test.rb:9:in `block (2 levels) in <main>'
        from /usr/local/lib/ruby/gems/1.9.1/gems/net-sftp-2.0.5/lib/net/sftp/operations/dir.rb:33:in `block in foreach'
        from /usr/local/lib/ruby/gems/1.9.1/gems/net-sftp-2.0.5/lib/net/sftp/operations/dir.rb:33:in `each'
        from /usr/local/lib/ruby/gems/1.9.1/gems/net-sftp-2.0.5/lib/net/sftp/operations/dir.rb:33:in `foreach'
        from ./test.rb:8:in `block in <main>'
        from /usr/local/lib/ruby/gems/1.9.1/gems/net-sftp-2.0.5/lib/net/sftp/session.rb:939:in `call'
        from /usr/local/lib/ruby/gems/1.9.1/gems/net-sftp-2.0.5/lib/net/sftp/session.rb:939:in `block in do_version'
        from /usr/local/lib/ruby/gems/1.9.1/gems/net-sftp-2.0.5/lib/net/sftp/session.rb:939:in `each'
        from /usr/local/lib/ruby/gems/1.9.1/gems/net-sftp-2.0.5/lib/net/sftp/session.rb:939:in `do_version'
        from /usr/local/lib/ruby/gems/1.9.1/gems/net-sftp-2.0.5/lib/net/sftp/session.rb:909:in `when_channel_polled'
        from /usr/local/lib/ruby/gems/1.9.1/gems/net-ssh-2.5.2/lib/net/ssh/connection/channel.rb:311:in `call'
        from /usr/local/lib/ruby/gems/1.9.1/gems/net-ssh-2.5.2/lib/net/ssh/connection/channel.rb:311:in `process'
        from /usr/local/lib/ruby/gems/1.9.1/gems/net-ssh-2.5.2/lib/net/ssh/connection/session.rb:214:in `block in preprocess'
        from /usr/local/lib/ruby/gems/1.9.1/gems/net-ssh-2.5.2/lib/net/ssh/connection/session.rb:214:in `each'
        from /usr/local/lib/ruby/gems/1.9.1/gems/net-ssh-2.5.2/lib/net/ssh/connection/session.rb:214:in `preprocess'
        from /usr/local/lib/ruby/gems/1.9.1/gems/net-ssh-2.5.2/lib/net/ssh/connection/session.rb:197:in `process'
        from /usr/local/lib/ruby/gems/1.9.1/gems/net-ssh-2.5.2/lib/net/ssh/connection/session.rb:161:in `block in loop'
        from /usr/local/lib/ruby/gems/1.9.1/gems/net-ssh-2.5.2/lib/net/ssh/connection/session.rb:161:in `loop'
        from /usr/local/lib/ruby/gems/1.9.1/gems/net-ssh-2.5.2/lib/net/ssh/connection/session.rb:161:in `loop'
        from /usr/local/lib/ruby/gems/1.9.1/gems/net-sftp-2.0.5/lib/net/sftp/session.rb:802:in `loop'
        from /usr/local/lib/ruby/gems/1.9.1/gems/net-sftp-2.0.5/lib/net/sftp/session.rb:787:in `connect!'
        from /usr/local/lib/ruby/gems/1.9.1/gems/net-sftp-2.0.5/lib/net/sftp.rb:32:in `start'
        from ./test.rb:7:in `<main>'

Вот мой код:

#!/usr/bin/ruby

require 'rubygems'
require 'net/sftp'
require 'rexml/document'

Net::SFTP.start('some.example.host','myuser',:password => 'fake') do |sftp|
    sftp.dir.foreach("/path/to/mydir/") do |xml|
        sftp.file.open("/path/to/mydir/"+xml.name) do |f|
            puts f.gets # < THIS BREAKS IT
        end
    end  
end

Код грязный и пока является тестом. Я ожидаю прочитать все файлы в удаленном каталоге и распечатать первую строку каждого файла.

Спасибо за любую помощь.


person dlite922    schedule 10.07.2012    source источник
comment
Если вы не хотите загружать файл, см. [здесь] [1] [1]: stackoverflow.com/a/25591097/3741845   -  person nubecoder    schedule 31.08.2014
comment
Если вы не хотите загружать файл, см. [здесь] [1] [1]: stackoverflow.com/a/25591097/3741845   -  person nubecoder    schedule 31.08.2014


Ответы (2)


Я думаю, что вы ищете либо это:

sftp.download!("/path/to/remote", "/path/to/local")

или это

 data = sftp.download!("/path/to/remote")

получил это из документации: http://net-ssh.rubyforge.org/sftp/v2/api/

person Cris    schedule 25.09.2012

Я получил аналогичную ошибку, когда пытался получить доступ к файлам, к которым у пользователя SFTP не было доступа.

Net::SFTP::StatusException: Net::SFTP::StatusException
    from /usr/local/rbenv/versions/1.9.3-p374/lib/ruby/gems/1.9.1/gems/net-sftp-2.0.5/lib/net/sftp/session.rb:846:in `wait_for'
    from /usr/local/rbenv/versions/1.9.3-p374/lib/ruby/gems/1.9.1/gems/net-sftp-2.0.5/lib/net/sftp/session.rb:561:in `stat!'
    from (irb):80
    from /usr/local/rbenv/versions/1.9.3-p374/lib/ruby/gems/1.9.1/gems/railties-3.2.13/lib/rails/commands/console.rb:47:in `start'
    from /usr/local/rbenv/versions/1.9.3-p374/lib/ruby/gems/1.9.1/gems/railties-3.2.13/lib/rails/commands/console.rb:8:in `start'
    from /usr/local/rbenv/versions/1.9.3-p374/lib/ruby/gems/1.9.1/gems/railties-3.2.13/lib/rails/commands.rb:41:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'
person spyle    schedule 31.05.2013