Ruby net/sftp read file remotely and save to database, get error StatusException (4, “failure”)

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

  •  20-06-2021
  •  | 
  •  

Question

I'm trying to download xmls from a remote sftp site, read the contents of the file into REXML and save the data to the DB. so far the code is up to reading the file and f.gets line fails with the error:

/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>'

Here's my code:

#!/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

The code is dirty and is a test for now. I expect to read all files in the remote directory and print the first line of each file.

Thanks for any help.

Was it helpful?

Solution

I think what you are looking for is either this:

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

or this

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

got this from the documentation: http://net-ssh.rubyforge.org/sftp/v2/api/

OTHER TIPS

I received a similar error when I was trying access files that the SFTP user didn't have access to.

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>'
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top