2009-11-09 38 views
3

我希望能夠使用SFTP登錄到許多服務器並下載某些文件,以便在出現問題時幫助您進行調試。雖然我們可以使用客戶端,但我們希望開始自動化流程以簡化所有內容。在Ruby中使用net-sftp進行基於密鑰的認證

我第一次嘗試看起來是這樣的:

def download(files_to_download, destination_directory) 
    Net::SFTP.start(@server, @username, :password => @password) do |sftp| 
     files_to_download.each do |f| 
      local_path = File.join(destination_directory, File.basename(f)) 
      sftp.download!(f, local_path) 
     end 
    end 
end 

雖然這個工作,它意味着我們需要的密碼。理想情況下,我想使用公共密鑰身份驗證,但是我無法在文檔或在線查看任何對此的引用 - 這可能嗎?

我不想使用奇爾卡特。

謝謝

回答

6

它自動完成,只需上傳您的公鑰,並應開箱即用。

使用公鑰/私鑰

公共/私有密鑰總是明確的密碼驗證嘗試過, 即使您提供密碼連接。因此,如果您只想使用公鑰/私鑰 身份驗證,只需從參數列表中刪除密碼即可。 如果您可以成功獲取會話句柄,那麼您的密鑰設置正確!

+0

真棒!謝謝。 我試過了,現在我得到了: c:/ruby/lib/ruby/gems/1.8/gems/net-sftp-2.0.2/lib/net/sftp.rb:43:在'start' :und 已定義的方法'shutdown!' for nil:NilClass(NoMethodError) from C:/sourcecode/log_downloader/sftp.rb:7:在'download' from C:/sourcecode/log_downloader/sftp.rb:24 從SSH日誌看來,它看起來像它不會執行接受公鑰,請求籤名步驟,winscp在那裏要求我接受密鑰?或者客戶是否幫我照顧過? – 2009-11-09 14:17:07

+0

這是否也適用於'Net :: SFTP'?還是隻有'Net :: SSH'? – 2012-08-07 21:36:53

+3

是的,這也適用於Net :: SFTP。如果您使用Net :: SSH/SFTP v2,則可以將私鑰作爲key_data選項傳遞給.start,如果將它保存到文件中對您來說不是一個好選擇。 – Ari 2013-01-11 22:52:02

9

如果要直接指定鍵(或other SSH options),你可以先open a Net::SSH connection,然後從那裏做SFTP操作。

Net::SSH.start("localhost", "user", keys: ['keys/my_key']) do |ssh| 
    ssh.sftp.upload!("/local/file.tgz", "/remote/file.tgz") 
    ssh.exec! "cd /some/path && tar xf /remote/file.tgz && rm /remote/file.tgz" 
end 

這也適用於網:: SCP

Net::SSH.start('localhost', 'user', keys: ['keys/my_key']) do |ssh| 
    ssh.scp.download("/local/file.txt", "/remote/file.txt") 
end