簡體   English   中英

帶有Net :: SSH的多個SSH躍點(Ruby)

[英]Multiple SSH hops with 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文件,當我嘗試從筆記本電腦連接到主機3時,該文件會自動將我路由到主機1和主機2。

我想做的是切出我要從筆記本電腦連接到主機3的第二個線程,以便可以刪除對.ssh / config文件的依賴性。 我想在第一個線程中進行所有連接。

因此,基本上,我需要進行多個源自筆記本電腦的躍點。 我可以啟動從筆記本電腦到主機1的第一個連接,然后在主機1上執行命令,但是此后我無法再進行任何操作了。 我需要做的是啟動從筆記本電腦到主機1的連接,在主機1上設置轉發,從主機1連接到主機2,然后在主機2上設置第二個轉發。

這可能與net / ssh有關嗎?

謝謝你的幫助!

我通過寫出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輸入中,在陷阱塊中,我刪除了配置文件並關閉了連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM