【问题标题】:How to SSH into a server and then SFTP from there to another server?如何通过 SSH 连接到服务器,然后从那里 SFTP 到另一台服务器?
【发布时间】:2013-05-22 10:34:09
【问题描述】:

情况如下:

我可以通过 SSH 访问 ServerA

我对 ServerB 有 SFTP 访问权限,但只能从 ServerA 访问

我想使用 Ruby SSH 到 ServerA,然后 SFTP 文件从 ServerB 到 ServerA。

我可以使用 Net::SSH 中的文档连接到 ServerA:

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!

我想不通的是如何从 ServerA 的上下文 SFTP 到 ServerB?

【问题讨论】:

  • 我认为你不能只使用在本地机器上运行的代码来做到这一点——我认为你需要使用在 A 上运行的代码来启动 A->B 连接。

标签: ruby net-ssh net-sftp


【解决方案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

【讨论】:

  • 不确定 scp 是否有效,因为我只有 (S)FTP 访问 server_b
【解决方案2】:

您可以在 Net::SSH::Gateway 类中声明 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

【讨论】:

    【解决方案3】:

    将网关库直接扩展到 net/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
    

    【讨论】:

      【解决方案4】:

      在命令行中,您可以指定在 SSH 进入服务器后要在服务器上执行的命令

      第一个谷歌结果:http://bashcurescancer.com/run_remote_commands_with_ssh.html

      所以你可以想象将 ssh 命令放在 Ruby 代码中的反引号中,然后执行 SFTP 命令

      #!/usr/bin/env ruby
      
      `ssh myserver 'sftp another-server'`
      

      需要研究的东西

      【讨论】: