2012-07-12 1 views
1

그래서 여기 내 설정입니다 : -> 호스트 1 -여러 SSH는 인터넷과 홉 :: SSH (루비)

노트북> 호스트 2 -> 호스트 3

는 노트북이 호스트 1에 도달하지만이 호스트 수 또는 호스트 3
호스트 1 호스트 2에 도달 할 수 있지만 3
호스트 3 호스트이 도달 할 수있는 호스트가 아닌 호스트 수 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 to Host 2. 별도의 스레드에서 랩톱에서 호스트 3으로 연결을 시작한 다음 호스트 3에서 호스트 2로 로컬 전달을 시작합니다.

랩톱에서 호스트 3에 연결할 수있는 유일한 방법은 다음과 같습니다. 내 .ssh/config 파일 때문에 랩톱에서 호스트 3에 연결하려고하면 자동으로 호스트 1과 호스트 2를 통해 라우팅됩니다.

내가 원하는 것은 .ssh/config 파일의 종속성을 제거 할 수 있도록 랩톱에서 호스트 3으로 연결하는 두 번째 스레드를 잘라 냈습니다. 첫 번째 스레드 내에서 모든 연결을 원합니다.

그래서 기본적으로 랩톱에서 발생한 여러 개의 홉을 수행해야합니다. 랩톱에서 호스트 1 로의 첫 번째 연결을 시작한 다음 호스트 1에서 명령을 실행할 수는 있지만 그 이후에는 더 이상 얻을 수 없습니다. 내가해야 할 일은 랩톱에서 호스트 1로 연결을 시작하고, 호스트 1에서 포워드를 설정하고, 호스트 1에서 호스트 2에 연결 한 다음 호스트 2에서 두 번째 포워드를 설정하는 것입니다.

가능한 작업은 다음과 같습니다. 그물/ssh와 함께?

도움 주셔서 감사합니다.

답변

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를 입력에서 연결을 포장하고, 트랩 블록에서 나는 설정 파일을 삭제하고 연결을 종료합니다.

관련 문제