2010-08-24 4 views
6

Ich habe hier ein kleines Problem: Ich versuche, eine Datei mit SCP und Ruby auf einen Server mit einem privaten Schlüssel hochzuladen. Der Code sieht so aus:Wie mache ich SCP mit Ruby und einem privaten Schlüssel?

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 

aber es gibt ein Problem ist, und nicht mit dem privaten Schlüssel, da wir es für die täglichen Zwecke nutzen, und ich erhalte die folgenden Protokollfehler:

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' 

Können Sie bitte darauf hinweisen, was hier falsch sein könnte? Ich habe zu diesem Zeitpunkt ziemlich begrenzte Erfahrungen mit Ruby.

+0

vielleicht auch nur auf den Befehl scp CallOut? – rogerdpack

+0

Wie ist @folder definiert? und fügen Sie bitte einen Beispielaufruf an die Methode transfer_file ein. –

+0

Nach einigen Schwierigkeiten konnten wir das Problem auf ein Problem mit der Umgebungskonfiguration eingrenzen. Der obige Code ist korrekt, Entschuldigung für den Ärger darum. Für Interessierte gab es einige Probleme mit dem Verzeichniszugriff auf der "anderen" Seite. – fritzone

Antwort

1

Ein kurzer Blick auf this Dokumentation schlägt vor, dass es eine ssh-Schlüsseloption nicht akzeptiert, wie Sie übergeben werden. Aber vorausgesetzt, Sie haben Recht, und ich bin falsch auf diesem Abschnitt,

, ohne zu sehen, welchen Wert Sie vorbei an transfer_file und was in @folder gespeichert ist, kann ich nur vermuten, aber davon aus, dass sie beiden Dateiobjekte sind, können Sie Verketten Sie die Objekte nicht. Sie müssen ihre Pfadattribute greifen. Vielleicht möchten Sie den Wert dieser beiden Variablen protokollieren, um sicherzustellen, dass Sie einen Pfad erhalten. Sie können auch mehr Glück mit dem Rubin "#{}" Methode haben String-Argumente verketten, wieder hier zu raten aber

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

und

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

1

Es scheint, dass dies jetzt möglich ist. Gemäß der net-scp docs können Sie eine Net :: SSH-Sitzung verwenden, um scp Befehle auszuführen. In Kombination mit this answer über die Verwendung mit einem privaten Schlüssel innerhalb Ruby-Authentifizierung:

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