1

だからここに私のセットアップがあります:

ラップトップ -> ホスト 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 へのリモート転送を設定し、次にホスト 1 からホスト 2 への別のリモート転送を設定しています。別のスレッドで、ラップトップからホスト 3 への別の接続を開始してから、ローカルホスト 3 からホスト 2 に転送します。

ラップトップからホスト 3 に接続できる唯一の方法は、ラップトップからホスト 3 に接続しようとすると、ホスト 1 とホスト 2 を介して自動的にルーティングされる .ssh/config ファイルによるものです。

私がやりたいことは、.ssh/config ファイルへの依存関係を削除できるように、ラップトップからホスト 3 に接続している 2 番目のスレッドを切り取ることです。最初のスレッド内からすべての接続を行いたいです。

したがって、基本的に、ラップトップから発信された複数のホップを実行する必要があります。ラップトップからホスト 1 への最初の接続を開始してから、ホスト 1 でコマンドを実行できますが、その後はそれ以上進むことができません。私がする必要があるのは、ラップトップからホスト 1 への接続を開始し、ホスト 1 で転送をセットアップし、ホスト 1 からホスト 2 に接続してから、ホスト 2 で 2 番目の転送をセットアップすることです。

これは net/ssh で可能ですか?

ご協力いただきありがとうございます!

4

1 に答える 1

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

接続をbegin/rescueブロックおよびトラップされたctrl+c入力でラップし、トラップブロックで構成ファイルを削除して接続をシャットダウンしました。

于 2012-07-18T14:24:00.613 に答える