2011-04-29 33 views
3

這裏的情況:如何SSH到服務器,然後從那裏到另一臺服務器的SFTP?

我有服務器A

SSH訪問我SFTP訪問服務器B,但只能從服務器A

我想用Ruby SSH到服務器A,然後從服務器B SFTP文件到ServerA。

我可以使用文檔從淨:: SSH連接到服務器A:

require 'net/ssh/gateway' 

gateway = Net::SSH::Gateway.new('server_a', 'user') 

gateway.ssh("server_a", "user") do |ssh| 
    # how to SFTP into server_b here and run SFTP commands? 
end 

gateway.shutdown! 

我想不通的是如何進入SFTP從服務器B服務器A的情況下?

+0

我不認爲你可以做本地機器上運行這個只用代碼 - 我想你」需要用運行在A上的代碼啓動A-> B連接。 – 2011-04-29 02:21:00

回答

0

在命令行中,你可以指定一個命令SSH'ing進去

第一款谷歌的結果後在服務器上執行:http://bashcurescancer.com/run_remote_commands_with_ssh.html

所以你可以想象放置SSH命令在反引號在Ruby代碼,然後執行命令SFTP

#!/usr/bin/env ruby 

`ssh myserver 'sftp another-server'` 

東西尋找到

1

假設你有你的私人按鍵設置,運行:

$ ssh-add 

而且寫的是這樣的:

require 'net/ssh' 

# Set :forward_agent => true so that it will automatically authenticate with server_b 
Net::SSH.start('server_a', 'user', :forward_agent => true) do |ssh| 
    puts ssh.exec!("scp -r server_b:dir_i_want_to_copy dir_to_copy_to/") 
end 
+0

不知道scp是否可以工作,因爲我只有(S)FTP訪問server_b – jemminger 2011-05-02 23:26:55

1

可以在淨:: SSH ::網關類中聲明SCP方法。

我已經複製了類似的ssh方法,它工作正常。

class Gateway < Net::SSH::Gateway 
     def scp(host, user, options={}, &block) 
     local_port = open(host, options[:port] || 22) 

     begin 
      Net::SCP.start("127.0.0.1", user, options.merge(:port => local_port), &block) 
     ensure 
      close(local_port) if block || $! 
     end 
     end 
    end 
1

直接擴展網關庫網/ SFTP工作很適合我:


class Net::SSH::Gateway 
    def sftp(host, user, options={}, &block) 
    local_port = open(host, options[:port] || 22) 
    begin 
     Net::SFTP.start("127.0.0.1", user, options.merge(:port => local_port), &block) 
    ensure 
     close(local_port) if block || $! 
    end 
    end 
end 
相關問題