注意:这与Use Ruby on Rails and SSH to access remote MySQL database on remote server类似,但是OP没有提供太多信息,并且给出的唯一答案没有回答这个问题。
我们最近将远程数据库从密码身份验证切换为基于ssh密钥的身份验证。我已经验证我可以通过优雅的Sequel Pro图形数据库客户端使用以下设置访问数据库(某些名称被故意混淆):
MySQL Host: woofwoof.us-west-2.rds.amazonaws.com
Username: bowser
Database: canine
Port: 3306
SSH Host: salt.woofwoof.com
SSH User: guardian
SSH Key: ~/.ssh/id_rsa
现在我需要Rails连接到同一个数据库,也使用基于ssh密钥的身份验证。
我的config/database.yml
文件中包含哪些内容?
到目前为止,我有:
canine:
adapter: mysql2
database: canine
username: bowser
host: woofwoof.us-west-2.rds.amazonaws.com
port: 3306
...但如何在SSH Host
文件中指定SSH User
,SSH Key
和config/database.yml
?
当我们的数据库有密码验证时,以下工作:
canine:
adapter: mysql2
database: canine
username: bowser
password: *secret*
host: woofwoof.us-west-2.rds.amazonaws.com
port: 3306
答案 0 :(得分:23)
首先,您需要在MySQL服务器上建立SSH隧道。在客户端计算机上,运行:
ssh -fNg -L 3307:127.0.0.1:3306 guardian@salt.woofwoof.com
这将建立到salt.woofwoof.com服务器的SSH隧道。与localhost端口3307的任何连接都将通过隧道发送到端口3306上的远程主机。
然后就像配置本地连接一样配置你的database.yml,但是指定转发端口3307:
canine:
adapater: mysql2
database: canine
username: bowser
password: *secret*
port: 3307
您可能还希望将ssh隧道设置添加到/ etc / inittab,以便在引导后建立隧道。有关如何执行此操作的示例,请参阅http://chxo.com/be2/20040511_5667.html。
答案 1 :(得分:2)
还有一个纯Rails解决方案
将以下内容添加到您的Gemfile
gem 'net-ssh-gateway'
然后创建一个课程
module RemoteConnectionManager
SSH_USER = 'YOUR_SSH_USER'
def self.port_through_tunnel(remote_host, port, local_port: nil, db_host:'localhost')
return Net::SSH::Gateway.new(remote_host, SSH_USER)
.open(db_host,port,local_port)
end
end
最后更改您的数据库。yml
adapter: mysql2
host: 127.0.0.1
port: <%= RemoteConnectionManager.port_through_tunnel('your_ssh_host', 3306, db_host: 'your_db_host_eg_some_aws_rds_db' ) %>
username: your_db_username
password: your_db_password
database: your_db_name
如果local_port为nil,Net / ssh将选择一个免费的