无法使用ssh tunnel和activerecord连接到远程数据库

我在使用以下脚本时遇到了一些麻烦:

require 'rubygems' require 'active_record' require 'net/ssh/gateway' gateway = Net::SSH::Gateway.new('myserver.com', 'myuser', :password => "mypass") puts "true" if gateway.active? p = gateway.open('127.0.0.1', 3306, 3307) class MyClass  "mysql", :host => "127.0.0.1", :username => "db_user", :password => "db_pass", :database => "mydb_production", :port => 3307 ) end puts MyClass.all.size gateway.shutdown! 

当我运行脚本时,它只是挂起,除非我删除activerecord查询。 我知道我可以使用隧道连接,因为我可以从命令创建隧道,如下所示:

 ssh -f myuser@myserver.com -L 3307/127.0.0.1/3306 -N 

如果我跑:

 require 'rubygems' require 'active_record' class MyClass  "mysql", :host => "127.0.0.1", :username => "db_user", :password => "db_pass", :database => "mydb_production", :port => 3307 ) end puts MyClass.all.size 

它工作正常。 我究竟做错了什么?

谢谢。

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

 require 'rubygems' require 'active_record' require 'mysql2' require 'net/ssh/gateway' gateway = Net::SSH::Gateway.new( 'remotehost.com', 'username' ) port = gateway.open('127.0.0.1', 3306, 3307) class Company < ActiveRecord::Base establish_connection( :adapter => "mysql2", :host => "127.0.0.1", :username => "dbuser", :password => "dbpass", :database => "dbname", :port => 3307 ) end puts Company.all.size 

我认为评论是正确的 – 数据库与ssh代码中的事件循环冲突。

试试这个:

  require 'rubygems' require 'active_record' require 'net/ssh/gateway' gateway = Net::SSH::Gateway.new('myserver.com', 'myuser', :password => "mypass") puts "true" if gateway.active? port = gateway.open('127.0.0.1', 3306, 3307) fork.do class MyClass < ActiveRecord::Base establish_connection( :adapter => "mysql", :host => "127.0.0.1", :username => "db_user", :password => "db_pass", :database => "mydb_production", :port => 3307 ) end puts MyClass.all.size end Process.wait gateway.shutdown!