如何在 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 数据库的主要内容,如果未能解决你的问题,请参考以下文章
MySQL 通过 SSH 隧道连接 - 如何指定其他 MySQL 服务器?