Comment créer un tunnel ssh en ruby et puis se connecter au serveur mysql sur l'hôte distant
Je voudrais créer un script ruby que je peux exécuter les commandes mysql sur un serveur distant à travers un tunnel ssh.
Droit maintenant, j'ai un processus manuel pour ce faire:
- Créer un tunnel -> ssh-L 3307:127.0.0.1:3306
- exécuter des scripts ruby.
- À proximité du tunnel.
J'aimerais être capable d'automatiser ce donc je ne peux il suffit d'exécuter le script.
exemple:
require 'rubygems'
require 'net/ssh/gateway'
require 'mysql'
#make the ssh connection -> I don't think I am doing this right.
Net::SSH.start('server','user') do |session|
session.forward.local(3307,'127.0.0.1', 3306)<br>
mysql = Mysql.connect("127.0.0.1","root","","",3307)
dbs = mysql.list_dbs<br>
dbs.each do |db|<br>
puts db <br>
end
session.loop(0){true}<br>
end
Une mise à jour - 2010-11-10:
Je suis vraiment très proche de ce code:
require 'rubygems'
require 'mysql'
require 'net/ssh/gateway'
gateway = Net::SSH::Gateway.new("host","user",{:verbose => :debug})
port = gateway.open("127.0.0.1",3306,3307)
# mysql = Mysql.connect("127.0.0.1","user","password","mysql",3307)
# puts "here"
# mysql.close
sleep(10)
gateway.close(port)
Lors de son sommeil, je suis en mesure d'ouvrir une fenêtre de terminal et de se connecter à mysql sur l'hôte distant. Ceci vérifie le tunnel est créé et de travail.
Le problème maintenant, c'est quand je décommentez les 3 lignes, il se bloque.
Vous devez vous connecter pour publier un commentaire.
J'ai pu obtenir que cela fonctionne sans une fourche à l'aide de la mysql2 gem
Mysql2::Error: Lost connection to MySQL server at 'reading initial communication packet', system error: 0
Cela pourrait être une solution possible:
Peut-être il ya une meilleure façon, mais ce qui fonctionne pour ce que j'essayais de faire.
NameError: uninitialized constant Net::SSH::Service::Forward::UNIXServer
. Aucune idée pourquoi?J'ai essayé la passerelle de code ci-dessus, une différence principale étant que j'ai à l'utilisation de clés ssh sans mot de passe pour l'accès, mais aussi trouver le code remise sur la base de données Mysql.déclaration de connexion. Cependant, quand j'ai remplacé
avec
il a bien fonctionné.
Mon code ressemble à ceci:
Habituellement, lorsqu'un tunnel est la liaison d'un port local vers le distant de port de l'application, il suffit de la connecter au port local comme si c'était la seule télécommande. Rappelez-vous que MySQL a les politiques d'accès basé sur l'emplacement de la source de la connexion, de sorte que vous voudrez peut-être garder à l'esprit. À mon avis, il n'y a pas de session.de l'avant.local nessessary.
Bien sûr, vous ne parlez pas la connexion MySQL protocole pourrait ne pas être ce que vous voulez. Il pourrait être plus facile d'abandonner ce que les requêtes à exécuter dans un fichier, puis exécuter mysql -u utilisateur-p"mot de passe"
Vous pouvez également essayer cette belle ruby gem: https://github.com/progrium/localtunnel