当前位置:  开发笔记 > 编程语言 > 正文

如何在ruby中创建ssh隧道,然后连接到远程主机上的mysql服务器

如何解决《如何在ruby中创建ssh隧道,然后连接到远程主机上的mysql服务器》经验,为你挑选了2个好方法。

我想创建一个ruby脚本,我可以通过ssh隧道在远程服务器上运行mysql命令.

现在我有一个手动过程来执行此操作:

    创建一个隧道 - > ssh -L 3307:127.0.0.1:3306

    运行ruby脚本.

    关闭隧道.

我希望能够自动化这个,所以我可以运行脚本.

例:

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)
mysql = Mysql.connect("127.0.0.1","root","","",3307) dbs = mysql.list_dbs
dbs.each do |db|
puts db
end session.loop(0){true}
end

更新 - 2010-11-10:
我真的很接近这个代码:

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)

当它休眠时,我能够打开终端窗口并连接到远程主机上的mysql.这将验证隧道是否已创建并正常工作.

现在的问题是,当我取消注释3行时,它只是挂起.



1> caspyin..:

我能够使用mysql2 gem在没有fork的情况下使用它

require 'rubygems'
require 'mysql2'
require 'net/ssh/gateway'

gateway = Net::SSH::Gateway.new(
  'remotehost.com',
  'username'
 )
port = gateway.open('127.0.0.1', 3306, 3307)

client = Mysql2::Client.new(
  host: "127.0.0.1",
  username: 'dbuser',
  password: 'dbpass',
  database: 'dbname',
  port: port
)
results = client.query("SELECT * FROM projects")
results.each do |row|
  p row
end
client.close


如果你使用rds,请确保将port = gateway.open('127.0.0.1',3306,3307)更改为port = gateway.open('myrdsinstance.whatever.com',3306,3307)

2> user498023..:

这可能是一种可能的解决方案:

require 'rubygems'  
require 'mysql'  
require 'net/ssh/gateway'  


gateway = Net::SSH::Gateway.new("server","user")  
port = gateway.open("127.0.0.1",3306,3307)

  child = fork do  
    mysql = Mysql.connect("127.0.0.1","user","password","mysql",port)  
    sql = "select sleep(5)"  
    mysql.query(sql)  
    mysql.close  
    exit  
  end  
  puts "child: #{child}"  
Process.wait  
gateway.close(port)  

也许有更好的方法,但这适用于我试图做的事情.


非常奇怪的是,没有分叉它不起作用,我尝试过Redis和Mongo,它没有任何叉子就可以正常工作.一定是一些mysql驱动问题.
推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有