Как подключиться по SSH к серверу, а затем оттуда по SFTP на другой сервер?

Вот ситуация:

У меня есть доступ SSH к ServerA

У меня есть доступ SFTP к ServerB, но только с ServerA

Я хочу использовать Ruby для SSH на ServerA, затем SFTP-файлы с ServerB на ServerA.

Я могу подключиться к ServerA, используя документацию от Net::SSH:

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 в ServerB из контекста ServerA?

4 ответа

Расширение библиотеки шлюза непосредственно до 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

Предполагая, что у вас настроены ваши закрытые ключи, запустите:

$ 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 в классе Net::SSH::Gateway.

Я скопировал подобный метод 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

Из командной строки вы можете указать команду, которая будет выполняться на сервере после SSH'инга в него

Первый результат Google: http://bashcurescancer.com/run_remote_commands_with_ssh.html

Таким образом, вы можете представить размещение команды ssh в обратных кодах в коде Ruby, а затем выполнить команду SFTP

#!/usr/bin/env ruby

`ssh myserver 'sftp another-server'`

Что-то, чтобы смотреть в

Другие вопросы по тегам