2012-07-12 6 views
1

Alors, voici ma configuration:SSH multiples sauts avec Net :: SSH (Ruby)

ordinateur portable -> Hôte 1 -> Hôte 2 -> Hôte 3

ordinateur portable peut atteindre l'hôte 1, mais pas hôte 2 ou hôte 3
hôte 1 peut atteindre l'hôte 2, mais pas hôte 3
hôte 3 peut atteindre l'hôte 2, mais pas hôte 1

ce que je suis en train de faire est de mettre en place vers l'avant à distance de sorte qu'un processus en cours sur l'hôte 3 sera acheminé au service en cours sur l'ordinateur portable. Je l'ai fait avec succès en utilisant ce le code suivant:

Run de portable:

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} 

Dans un fil, je suis la mise en place d'une télécommande avant de portable à l'hôte 1 et puis un autre à distance avant de l'hôte 1 à l'hôte 2. Dans un fil séparé, je commence une autre connexion de l'ordinateur portable à l'hôte 3, puis exécute un transfert local de l'hôte 3 à l'hôte 2.

La seule façon de me connecter de l'ordinateur portable à l'hôte 3 est à cause de mon fichier .ssh/config, qui me fait automatiquement passer par l'hôte 1 et l'hôte 2 lorsque j'essaie de me connecter à l'hôte 3 depuis l'ordinateur portable. Ce que je veux faire est de couper le deuxième thread où je me connecte de l'ordinateur portable à l'hôte 3 afin que je puisse supprimer la dépendance sur le fichier .ssh/config. Je veux faire toutes mes connexions depuis le premier fil.

Donc, fondamentalement, j'ai besoin de faire plusieurs sauts qui proviennent de l'ordinateur portable. Je peux lancer la première connexion de l'ordinateur portable à l'hôte 1, puis exécuter une commande sur l'hôte 1, mais après cela, je ne peux plus aller plus loin. Ce que je dois faire est d'initier la connexion de l'ordinateur portable à l'hôte 1, configurer l'avant sur l'hôte 1, se connecter à l'hôte 2 de l'hôte 1, puis configurer la deuxième sur l'hôte 2.

Est-ce possible? avec net/ssh?

Merci pour votre aide!

Répondre

1

J'ai corrigé ce problème en écrivant un fichier de configuration SSH, puis en spécifiant le fichier de configuration lors de l'initialisation de la connexion. Le fichier de configuration contient des commandes proxy qui acheminent automatiquement les hôtes nécessaires pour atteindre ma destination.

Exemple:

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 

J'enveloppé la connexion dans un begin/sauvetage bloqué et piégé entrée ctrl + c, et dans le bloc de supprimer le piège que je fichier de configuration et arrêter la connexion.

Questions connexes