如何在 ruby​​ 中使用 ssh 隧道连接 postgres 数据库

Posted

技术标签:

【中文标题】如何在 ruby​​ 中使用 ssh 隧道连接 postgres 数据库【英文标题】:How to connect postgres databases using ssh tunnel in ruby 【发布时间】:2016-10-23 08:20:46 【问题描述】:

这是我的问题,我想通过 ruby​​ 脚本访问我们的数据库,我可以使用 ssh 隧道通过 PSequal 连接到数据库。当我尝试从 ruby​​ 连接到数据库时,它总是返回我超时错误。

错误消息是这样的:“无法连接到服务器:操作超时 服务器是否在主机“HOSTNAME”(IP 地址)上运行并接受 端口 5432 上的 TCP/IP 连接"

我尝试在终端中使用“psql -h -d -U”登录,但得到了相同的答案。谢谢

def connectDb
  begin
    file = File.open("pem file")
    gateway = Net::SSH::Gateway.new('hostname', 'username', keys_only: true, port: 22, key_data: file)
    port_pg = gateway.open('hostname', 5432)
    puts port_pg
    con = PG::Connection.open('hostname', portpg, "", "", 'dbname', 'username', 'password')
  rescue PG::Error => e
    puts e.message
  end
end

【问题讨论】:

请不要在图片中添加代码。这使回答您的问题变得更加困难。相反,请将代码以文本形式放入您的帖子中,以便回答者可以轻松看到。 您是否有理由希望通过 SSH 连接而不是仅使用数据库驱动程序直接连接到数据库? 为什么不直接创建一个适当的 database.yml 条目并在您的模型中使用该连接? @CacheStaheli 感谢您的提醒。我会在以后的帖子中这样做。 @JustinWood 我正在使用 pg 驱动程序连接到数据库,但它总是返回我超时错误。我尝试了像 Postico 这样的 pg 客户端版本,它在连接之前需要 ssh 信息,这让我觉得我可能需要 ssh 才能连接到数据库 【参考方案1】:

确保您的 Postgres 服务器正在侦听正确的端口 在 postgresql.conf 中(可能位于 /etc/postgresql/9.3/main/postgresql.conf 之类的地方注释掉

#listen_addresses = 'localhost'

并在所有端口上添加监听

listen_addresses = '*'

Postgres 配置文件可能归 Postgres 所有,这会使它们更难找到。

登录您的 postgres 数据库并运行

SHOW config_file;

这应该为您提供位置,然后您就可以编辑文件

查看this *** 线程以获取更多信息 编辑文件后(您可能需要 sudo 权限才能执行此操作,即sudo vim path_to/config_file),您需要重新启动 postgres 才能使更改生效。如何重新启动将取决于 pg 的设置方式,但很可能它作为服务运行,所以跟随者应该可以解决问题。

sudo service postgres restart

如果没有,请询​​问您的主机如何重新启动

在您的 database.yml 文件中为远程服务器创建一个条目 例如

remote:
  adapter: postgresql
  database: remote_db_name
  username: xxx
  password: xxx
  pool: 5
  timeout: 5000
  host: ip_address_for_remote_server
  port: prob_3306_but_whatever_port_you_have_configured_on_remote_server
  strict: false

然后创建一组特定的模型来处理远程数据库并与database.yml条目建立连接

例如

class SomeTableNameOnRemoteServer < ActiveRecord::Base
    establish_connection :remote
    #etc...

不要试图使用已经连接到本地数据库的模型。如果您想共享逻辑,请创建一个模块并将该模块包含在两个模型类中

进一步阅读可能会有所帮助。这是有关如何在 DigitalOcean 液滴上设置和配置 pg 的指南

https://www.digitalocean.com/community/tutorials/scaling-ruby-on-rails-setting-up-a-dedicated-postgresql-server-part-3

页面下方有一个关于远程访问的部分,但您可能会发现整个文档很有用,因此不要在此处粘贴内容。

【讨论】:

感谢您的回答和耐心。我修改了我的问题。我只在 /usr/local/bin/ 路径下找到 psql,在 /etc 路径下没有找到任何与 psql 相关的东西。谢谢! @Shark 也一定要检查你的防火墙的端口访问 @jamesw感谢您的更新和时间。我真的很感谢你的帮助。当我尝试从终端登录到数据库服务器时,我收到相同的错误消息:“无法连接到服务器:操作超时服务器是否在主机上运行“...”(IP 地址)并接受 TCP/IP端口 5432 上的连接”。我已经更新了我的问题。 @Shark,这很可能是因为您的 pg 服务器没有运行。启动它并检查输出,它是否失败?它开始了吗?如果正在运行,请检查它正在运行的端口 我尝试连接的 pg 服务器正在运行,因为我可以使用相同的主机名和用户名和密码通过 Postico 或 PSequal 客户端版本连接到它。但是在客户端版本中,我需要填写一个额外的区域是SSH隧道,我将跳转框填充为ssh主机,并将pem文件上传到身份文件中,这样我就可以通过客户端版本成功连接到pg服务器。但是,当我尝试通过终端连接到 pg 服务器时,我得到了这个错误。再次感谢您的耐心和时间。 @jamesw

以上是关于如何在 ruby​​ 中使用 ssh 隧道连接 postgres 数据库的主要内容,如果未能解决你的问题,请参考以下文章

通过 php 中的 ssh 连接隧道请求

MySQL 通过 SSH 隧道连接 - 如何指定其他 MySQL 服务器?

如何使用 Node.js 建立与 MongoDB 数据库的 SSH 隧道连接

通过 SSH 隧道的 MySQL 连接

通过 ssh 迁移工作台 - 如何设置隧道

如何在MacOS上创建ssh隧道? [关闭]