Несколько переходов SSH с помощью Net::SSH (Ruby)

Итак, вот моя установка:

Ноутбук -> Хост 1 -> Хост 2 -> Хост 3

Ноутбук может связаться с хостом 1, но не с хостом 2 или хостом 3
Хост 1 может связаться с хостом 2, но не с хостом 3
Хост 3 может связаться с хостом 2, но не с хостом 1

То, что я пытаюсь сделать, это настроить удаленную переадресацию, чтобы процесс, работающий на хосте 3, был перенаправлен на запущенную службу на ноутбуке. Я успешно сделал это, используя следующий код:

Запуск с ноутбука:

require 'rubygems'
require 'net/ssh'

threads = []
config = {:user => "user", :remote_port => 3333, :service_port => 2222}

threads << Thread.new{
Net::SSH.start("host1", config[:user]) do |ssh|
  puts "Forwarding port #{config[:remote_port]} on host1 to #{config[:service_port]} on localhost"
  ssh.forward.remote(config[:service_port], "localhost", config[:remote_port], "127.0.0.1")
  ssh.exec! "ssh #{config[:user]}@host2 -R #{config[:remote_port]}:localhost:#{config[:remote_port]}"
  ssh.loop {true}
end
}

threads << Thread.new{
Net::SSH.start("host3", config[:user]) do |ssh|
  puts "Creating local forward for port #{config[:service_port]} on host3 to port #{config[:remote_port]} on host2"
  ssh.exec! "ssh #{config[:user]}@host2 -L #{config[:service_port]}:localhost:#{config[:remote_port]}"
  ssh.loop {true}
end
}

threads.each {|t| t.join}

В одном потоке я настраиваю удаленную переадресацию с ноутбука на хост 1, а затем другую удаленную переадресацию с хоста 1 на хост 2. В отдельном потоке я запускаю еще одно подключение с ноутбука на хост 3, затем запускаю локальный переадресация с хоста 3 на хост 2.

Единственный способ подключиться с ноутбука к хосту 3 — это мой файл .ssh/config, который автоматически направляет меня через хост 1 и хост 2, когда я пытаюсь подключиться к хосту 3 с ноутбука.

Что я хочу сделать, так это вырезать второй поток, в котором я подключаюсь с ноутбука к хосту 3, чтобы я мог удалить зависимость от файла .ssh/config. Я хочу сделать все свои соединения из первого потока.

Так что в основном мне нужно сделать несколько прыжков, которые исходят от ноутбука. Я могу инициировать первое подключение с ноутбука к хосту 1, а затем выполнить команду на хосте 1, но после этого я не могу двигаться дальше. Что мне нужно сделать, так это инициировать подключение с ноутбука к хосту 1, настроить переадресацию на хосте 1, подключиться к хосту 2 с хоста 1, а затем настроить вторую переадресацию на хосте 2.

Возможно ли это сделать с помощью net/ssh?

Спасибо за вашу помощь!


person Aaron    schedule 12.07.2012    source источник


Ответы (1)


Я исправил это, написав файл конфигурации SSH, а затем указав файл конфигурации при инициировании соединения. Файл конфигурации содержит прокси-команды, которые автоматически прокладывают маршрут через необходимые хосты, чтобы добраться до места назначения.

Пример:

def write_config_file

    File.open('confi_file', 'w') { |f|
      f << "host host1\n"
      f << "HostName host1.something.net\n"
      f << "user user_name\n"
      f << "\n"
      f << "host host2\n"
      f << "HostName host2.something.net\n"
      f << "ProxyCommand ssh host1 nc %h %p 2> /dev/null\n"
      f << "user user_name\n"
      f << "\n"
      f << "host host3\n"
      f << "HostName host3.something.net\n"
      f << "ProxyCommand ssh host2 nc %h %p 2> /dev/null\n"
      f << "user user_name\n"
    } 

end

write_config_file

Net::SSH.start("host3", "user_name", :config => './config_file') do |ssh|
  #whatever you need to do...
end

Я завернул соединение в начало/спасение, заблокированное и перехваченное вводом ctrl+c, а в блоке ловушки я удалил файл конфигурации и закрыл соединение.

person Aaron    schedule 18.07.2012