Как мне сделать SCP с Ruby и закрытым ключом? - PullRequest
6 голосов
/ 24 августа 2010

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

  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

Однако есть некоторая проблема, а не с закрытым ключом, так как мы используем его для повседневных целей, и я получаю следующую ошибку журнала:

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'

Не могли бы вы указать, что здесь может быть не так? У меня довольно ограниченный опыт работы с Ruby на этом этапе.

Ответы [ 2 ]

1 голос
/ 06 декабря 2015

Кажется, что это теперь возможно. В соответствии с net-scp docs , вы можете использовать сеанс Net :: SSH для выполнения scp команд. В сочетании с этот ответ об использовании аутентификации с закрытым ключом в 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
1 голос
/ 24 августа 2010

краткий обзор этой документации предполагает, что она не принимает опцию ssh key, когда вы передаете. Но при условии, что вы правы, а я ошибаюсь,

, не видя, какое значение вы передаете в файл Transfer_file и что хранится в @folder, я могу только догадываться, но предполагая, что они оба являются объектами файлов, вы не можете объединить объекты. Вы должны захватить их атрибуты пути. Вы можете записать значение этих двух переменных, чтобы убедиться, что вы получаете путь. вам также может повезти, если вы используете метод ruby ​​"#{}" для конкатенации строковых аргументов, опять же догадываясь, но

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

и

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

...