首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为远程数据库的无密码访问配置Rails?

问如何为远程数据库的无密码访问配置Rails?
EN

Stack Overflow用户
提问于 2014-11-06 07:49:35
回答 2查看 5.1K关注 0票数 15

注意:这类似于https://stackoverflow.com/questions/22923814/use-ruby-on-rails-and-ssh-to-access-remote-mysql-database-on-remote-server,但是OP没有提供太多的信息,唯一的答案是没有回答问题。

背景

最近,我们将远程数据库从密码身份验证转换为基于ssh密钥的身份验证。我已经验证,我可以通过优雅的续集Pro图形db客户机访问数据库,设置如下(有些名称有意混淆):

代码语言:javascript
复制
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文件里有什么?

到目前为止,我已经:

代码语言:javascript
复制
canine:
    adapter: mysql2
    database: canine
    username: bowser
    host: woofwoof.us-west-2.rds.amazonaws.com
    port: 3306

..。但是,如何在SSH Host文件中指定SSH User、SSH User和SSH Key?

附加信息

当我们的数据库具有密码身份验证时,以下操作有效:

代码语言:javascript
复制
canine:
    adapter: mysql2
    database: canine
    username: bowser
    password: *secret*
    host: woofwoof.us-west-2.rds.amazonaws.com
    port: 3306
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-06 18:50:03

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

代码语言:javascript
复制
ssh -fNg -L 3307:127.0.0.1:3306 guardian@salt.woofwoof.com

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

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

代码语言:javascript
复制
canine:
  adapater: mysql2
  database: canine
  username: bowser
  password: *secret*
  port: 3307

您还可能希望将ssh隧道设置添加到/etc/inittab,以便在引导后建立隧道。有关如何执行此操作的一个示例,请参阅5667.html。

票数 31
EN

Stack Overflow用户

发布于 2020-03-04 11:12:03

还有一种纯rails解决方案。

将以下内容添加到Gemfile中

代码语言:javascript
复制
 gem 'net-ssh-gateway'

然后创建一个类

代码语言:javascript
复制
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

最后一次更改database.yml

代码语言:javascript
复制
  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是0,Net/ssh将选择一个免费的

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26774264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档