6

I have a small problem here: I try to upload a file using SCP and Ruby to a server using a private key. The code looks like:

  def transfer_file(source_file, destination_file)
     $log.info("ScpDP: Key=#{@key}")
     Net::SCP.start(@host, @userName, :keys => @key ) do |scp|
       scp.upload!(source_file,@folder + destination_file, :ssh => @key)
     end
  end

However there is some problem, and not with the private key since we use it for daily purposes, and I get the following log error:

I, [2010-08-24T11:21:27.247847 #14310]  INFO -- : ScpDP: Key=/home/myself/.ssh/id_rsa
I, [2010-08-24T11:21:27.397971 #14310]  INFO -- : SCP did not finish successfully (1)   (Net::SCP::Error)
/usr/lib/ruby/gems/1.8/gems/net-scp-1.0.2/lib/net/scp.rb:351:in `start_command'
/usr/lib/ruby/gems/1.8/gems/net-ssh-2.0.11/lib/net/ssh/connection/channel.rb:585:in `call'
/usr/lib/ruby/gems/1.8/gems/net-ssh-2.0.11/lib/net/ssh/connection/channel.rb:585:in `do_close'
/usr/lib/ruby/gems/1.8/gems/net-ssh-2.0.11/lib/net/ssh/connection/session.rb:575:in `channel_close'
/usr/lib/ruby/gems/1.8/gems/net-ssh-2.0.11/lib/net/ssh/connection/session.rb:455:in `send'
/usr/lib/ruby/gems/1.8/gems/net-ssh-2.0.11/lib/net/ssh/connection/session.rb:455:in `dispatch_incoming_packets'
/usr/lib/ruby/gems/1.8/gems/net-ssh-2.0.11/lib/net/ssh/connection/session.rb:212:in `preprocess'
/usr/lib/ruby/gems/1.8/gems/net-ssh-2.0.11/lib/net/ssh/connection/session.rb:196:in `process'
/usr/lib/ruby/gems/1.8/gems/net-ssh-2.0.11/lib/net/ssh/connection/session.rb:160:in `loop'
/usr/lib/ruby/gems/1.8/gems/net-ssh-2.0.11/lib/net/ssh/connection/session.rb:160:in `loop_forever'
/usr/lib/ruby/gems/1.8/gems/net-ssh-2.0.11/lib/net/ssh/connection/session.rb:160:in `loop'
/usr/lib/ruby/gems/1.8/gems/net-ssh-2.0.11/lib/net/ssh/connection/session.rb:109:in `close'
/usr/lib/ruby/gems/1.8/gems/net-scp-1.0.2/lib/net/scp.rb:204:in `start'
/home/myself/work/server.rb:458:in `transfer_file'

Can you please point out what might be wrong here? I have quite limited Ruby experience at this stage.

the Tin Man
  • 158,662
  • 42
  • 215
  • 303
Ferenc Deak
  • 34,348
  • 17
  • 99
  • 167
  • maybe just callout to the scp command? – rogerdpack Aug 24 '10 at 13:13
  • how is @folder defined? and please include a sample call to the transfer_file method – Jed Schneider Aug 24 '10 at 16:25
  • After some struggle we managed to narrow down the problem to an environment configuration issue. The code above is correct, sorry for the hassle around it. For those interested there were some directory access right issues on the "other" side. – Ferenc Deak Sep 10 '10 at 07:15

2 Answers2

2

Seems that this is now possible. According to the net-scp docs, you can use a Net::SSH session to perform scp commands. Combined with this answer about using authenticating with a private key within Ruby:

require 'net/ssh'
require 'net/scp'

ssh_private_keys = ['ssh-rsa AAAAB3NzaC1yc2EAAA', 'ssh-rsa AAAAB3NzaC1yc2EAAA']
Net::SSH.start(hostname, username, key_data: ssh_private_keys, keys_only: true) do |ssh|
  ssh.scp.upload!(source_file, destination_file)
end
Community
  • 1
  • 1
Robin Daugherty
  • 7,115
  • 4
  • 45
  • 59
1

a brief look at this documentation suggests that it doesn't accept an ssh key option, as you are passing. But assuming you are right and I am wrong on that portion,

without seeing what value you are passing to transfer_file and what is stored in @folder, i can only guess, but assuming that they are both file objects, you can't concatenate the objects. you have to grab their path attributes. you might want to log the value of those two variables to make sure you are getting a path. you may also have better luck using the ruby "#{}" method to concat string arguments, again guessing here but

path = "#{@folder.path}/#{destination_file.path}" #=> "my_folder/destination_folder

and

scp.upload!(source_file,path, :ssh => @key)

Jed Schneider
  • 14,085
  • 4
  • 35
  • 46