Как подключиться по 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'`
Что-то, чтобы смотреть в