2010-08-24 14 views
6

Tengo un pequeño problema aquí: intento subir un archivo usando SCP y Ruby a un servidor usando una clave privada. El código es el siguiente:¿Cómo hago SCP con Ruby y una clave privada?

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 

Sin embargo hay algún problema, y ​​no con la clave privada ya que utilizamos para fines diarias, y me sale el siguiente error de registro:

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' 

¿Puede usted por favor señale qué podría estar mal aquí? Tengo una experiencia bastante limitada de Ruby en esta etapa.

+0

tal vez sólo de llamada al comando SCP? – rogerdpack

+0

¿cómo se define @folder? e incluya una llamada de muestra al método transfer_file –

+0

Después de algunas dificultades, logramos reducir el problema a un problema de configuración del entorno. El código anterior es correcto, disculpe la molestia que lo rodea. Para los interesados ​​hubo algunos problemas de acceso a los directorios en el lado "otro". – fritzone

Respuesta

1

un breve vistazo a this La documentación sugiere que no acepta una opción de clave ssh, ya que está pasando. Pero asumiendo que tienes razón y estoy equivocado en esa parte,

sin ver qué valor estás transfiriendo a transfer_file y qué está almacenado en @folder, solo puedo adivinar, pero asumiendo que ambos son objetos de archivo, puedes concatenar los objetos. tienes que agarrar sus atributos de ruta. Es posible que desee registrar el valor de esas dos variables para asegurarse de obtener una ruta. usted también puede tener mejor suerte con el método de rubí "#{}" a concat argumentos de cadena, de nuevo aquí, pero adivinando

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

y

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

1

Parece que esto es ahora posible. De acuerdo con net-scp docs, puede usar una sesión Net :: SSH para ejecutar los comandos scp. Combinado con this answer sobre el uso de la autenticación con una clave privada dentro de 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 
Cuestiones relacionadas