2010-08-24 6 views
6

Ho un piccolo problema qui: provo a caricare un file usando SCP e Ruby su un server usando una chiave privata. Il codice è simile:Come si esegue SCP con Ruby e una chiave privata?

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 

Tuttavia c'è qualche problema, e non con la chiave privata da quando lo usiamo per scopi quotidiana, e ottengo il seguente errore di 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' 

potete per favore fai notare cosa potrebbe esserci di sbagliato qui? Ho un'esperienza Ruby abbastanza limitata in questa fase.

+0

forse solo richiamo al comando SCP? – rogerdpack

+0

come viene definito @folder? e per favore includi una chiamata di esempio al metodo transfer_file –

+0

Dopo alcune difficoltà siamo riusciti a restringere il problema a un problema di configurazione dell'ambiente. Il codice sopra è corretto, mi dispiace per il fastidio che ci sta dietro. Per chi fosse interessato c'erano alcuni problemi di accesso alla directory sul lato "altro". – fritzone

risposta

1

una breve occhiata alla documentazione this suggerisce che non accetta un'opzione di chiave ssh, mentre si sta passando. Ma supponendo che tu abbia ragione e io abbia torto su quella porzione,

senza vedere quale valore stai passando a transfer_file e cosa è memorizzato in @folder, posso solo supporre, ma assumendo che siano entrambi gli oggetti di file, puoi concatenare gli oggetti devi afferrare i loro attributi di percorso. potresti voler registrare il valore di queste due variabili per assicurarti di ottenere un percorso. si può anche avere più fortuna con il metodo rubino "#{}" per concat argomenti stringa, indovinando di nuovo qui, ma

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

e

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

1

Sembra che questo è ora possibile. In base allo net-scp docs, è possibile utilizzare una sessione Net :: SSH per eseguire i comandi scp. combinato con this answer sull'utilizzo di autenticazione con una chiave privata all'interno di Rubino:

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