所以这是我的设置:
笔记本电脑 - >主机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有关吗?
感谢您的帮助!
答案 0 :(得分: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输入中,并且在陷阱块中我删除了配置文件并关闭了连接。