2010-06-02 35 views
3

J'accède à une base de données distante à l'aide d'un transfert de port local vers distant depuis ma boîte de dialogue Windows. Cela fonctionne comme un charme en utilisant putty pour la redirection de port, mais il échoue lorsque j'essaie de transmettre en utilisant Ruby/Net :: SSH. Voici mon extrait de code:Réacheminement de port local vers distant à l'aide de Ruby/Net :: SSH pour une connexion à distance db

require 'rubygems' 
require 'net/ssh' 

Net::SSH.start(remote_host, user_name, :password => password) do |ssh| 
    ssh.logger.sev_threshold=Logger::Severity::DEBUG 
    ssh.forward.local(5555, 'www.google.com', 80) # works perfectly 
    ssh.forward.local(4444, remote_host, 1234) # db connection hangs up 
    ssh.loop { true } 
end 

Le port redirigé vers google.com fonctionne correctement lorsqu'il est testé avec un navigateur. Le port forward vers mon serveur Linux, où mon serveur db écoute sur le port 1234, ne fonctionne pas. Lorsque j'essaie de me connecter à localhasot: 4444 la connexion raccroche. Journaux:

DEBUG -- net.ssh.service.forward[24be0d4]: received connection on 127.0.0.1:4444 
DEBUG -- tcpsocket[253ba08]: queueing packet nr 6 type 90 len 76 
DEBUG -- tcpsocket[24bde64]: read 8 bytes 
DEBUG -- tcpsocket[253ba08]: sent 100 bytes 
DEBUG -- net.ssh.connection.channel[24bdcc0]: read 8 bytes from client, sending over local forwarded connection 

Et puis rien!

J'utilise net-ssh 2.0.22/ruby ​​1.8.7

+0

Essayez de commenter l'avant de google et faites-en un en avant. Est ce que ça aide? – barrycarter

+0

Malheureusement, cela ne fonctionne pas. – nakhli

Répondre

1

Modifier la deuxième remote_host-'localhost'. Votre serveur de base de données est probablement lié à 127.0.0.1 (localhost), mais votre transfert SSH envoie des paquets à votre adresse IP externe (obtenu en résolvant remote_host).

Ssh à la boîte Linux et exécuter sudo netstat -n --tcp --listen -p. Par exemple, je vois ceci:

Active Internet connections (only servers) 
Proto Recv-Q Send-Q Local Address   Foreign Address   State  PID/Program name 
... 
tcp  0  0 127.0.0.1:5432   0.0.0.0:*    LISTEN  1552/postgres 

qui implique postgres écoute uniquement 127.0.0.1 (valeur de Local Address). Si je lance la commande psql -h 127.0.0.1, je peux me connecter à ma base de données. Mais si je lance la commande psql -h <hostname> ou psql -h <my external IP>, la connexion est refusée.

En outre, si j'ai ssh.forward.local(4444, remote_host, 5432), je ne peux pas me connecter à ma base de données via le port en avant. Mais si j'ai ssh.forward.local(4444, 'localhost', 5432), je peux me connecter.

Essayez ceci:

Net::SSH.start(remote_host, user_name, :password => password) do |ssh| 
    ssh.forward.local(4444, 'localhost', 1234) 
    ssh.loop { true } 
end 

Notez que « localhost » dans ce cas, est interprété par rapport à l'hôte auquel vous avez connecté via ssh, à savoir l'hôte distant.

+0

Je vais essayer, merci. – nakhli