如何配置Rails以实现对远程数据库的无密码访问

fea*_*ool 10 ruby mysql ssh ruby-on-rails

注意:这类似于使用Ruby on Rails和SSH来访问远程服务器上的远程MySQL数据库,但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
Run Code Online (Sandbox Code Playgroud)

现在我需要Rails连接到同一个数据库,也使用基于ssh密钥的身份验证.

这个问题

我的config/database.yml档案里有什么?

到目前为止,我有:

canine:
    adapter: mysql2
    database: canine
    username: bowser
    host: woofwoof.us-west-2.rds.amazonaws.com
    port: 3306
Run Code Online (Sandbox Code Playgroud)

...但是如何指定SSH Host,SSH UserSSH Keyconfig/database.yml文件中?

附加信息

回到我们的数据库进行密码验证时,以下工作:

canine:
    adapter: mysql2
    database: canine
    username: bowser
    password: *secret*
    host: woofwoof.us-west-2.rds.amazonaws.com
    port: 3306
Run Code Online (Sandbox Code Playgroud)

inf*_*sed 23

首先,您需要在MySQL服务器上建立SSH隧道.在客户端计算机上,运行:

ssh -fNg -L 3307:127.0.0.1:3306 guardian@salt.woofwoof.com
Run Code Online (Sandbox Code Playgroud)

这将建立到salt.woofwoof.com服务器的SSH隧道.与localhost端口3307的任何连接都将通过隧道发送到端口3306上的远程主机.

然后像配置本地连接一样配置database.yml,但是指定转发端口3307:

canine:
  adapater: mysql2
  database: canine
  username: bowser
  password: *secret*
  port: 3307
Run Code Online (Sandbox Code Playgroud)

您可能还希望将ssh隧道设置添加到/ etc/inittab,以便在引导后建立隧道.有关如何执行此操作的示例,请参见http://chxo.com/be2/20040511_5667.html.

  • 这对我有用,但有一个小的修正。我在设置隧道时使用了数据库的主机名,而不是 127.0.0.1,如下所示:ssh -fNg -L 3307:woofwoof.us-west-2.rds.amazonaws.com:3306 Guardian@salt.woofwoof。由于这篇文章,我意识到我需要使用 db 主机名而不是 127.0.0.1:https://support.cloud.engineyard.com/hc/en-us/articles/205408088-Access-Your-Database-Remotely -Through-an-SSH-Tunnel (2认同)

Ste*_*fan 6

还有一个纯rails的解决方案

将以下内容添加到您的 Gemfile 中

 gem 'net-ssh-gateway'
Run Code Online (Sandbox Code Playgroud)

然后创建一个类

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
Run Code Online (Sandbox Code Playgroud)

最后更改你的database.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
Run Code Online (Sandbox Code Playgroud)

如果 local_port 为零 Net/ssh 将选择一个免费的