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

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

У меня есть доступ SSH к серверу A

У меня есть доступ SFTP к Серверу B, но только с СервераA

Я хочу использовать 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 ]

1 голос
/ 19 мая 2013

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

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

$ 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
1 голос
/ 23 апреля 2013

Вы можете объявить метод 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
0 голосов
/ 29 апреля 2011

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

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

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

#!/usr/bin/env ruby

`ssh myserver 'sftp another-server'`

Что посмотреть

...