gpt4 book ai didi

ruby - 使用 Ruby 通过网关连接到远程数据库

转载 作者:数据小太阳 更新时间:2023-10-29 08:09:34 25 4
gpt4 key购买 nike

我的目标 oracle 数据库服务器存在于防火墙之外。我使用 ssh 隧道连接到防火墙之外的服务器,将其称为 friendly-server。然后从我的本地主机,我使用 DBI 连接到存在于另一台服务器上的目标数据库,将其称为 target-dbserverSimilar question建议使用下面的命令行。

这是我用来设置隧道的 ssh 命令:

ssh -nN -L 1520:target-dbserver:1520 friendly-server

我想在 Ruby 中实现它,所以我使用 net-ssh-gateway gem 。我可能只是不明白 ssh 隧道是如何工作的,因为我不知道一旦我建立了网关,然后随后的 ssh 到 friendly-server,我就不知道如何建立 DBI连接到 target-dbserver 上的数据库。

# Set up the gateway. The gem will find an unused port.
gateway = Net::SSH::Gateway.new('friendly-server', 'user')
# Establish ssh connection
gateway.ssh('friendly-server', 'user') do |ssh|
# now how to make DBI connection to target-dbserver ?
end

尝试过但失败了,因为 DBI 调用如何知道使用隧道?

gateway = Net::SSH::Gateway.new('friendly-server', 'user')
gateway.ssh('friendly-server', 'user') do |ssh|
db = DBI.connect('target server connection string', 'user','password')
end

使用gateway.open 方法。这对我来说似乎合乎逻辑,但当我尝试通过本地主机(网关)通过 DBI 连接到目标数据库时,它总是挂起。我认为可能是因为 .open 方法建立了一个我不想要的 targetdb 的 ssh 连接。我希望与 dbtarget 的唯一联系是通过 DBI 连接。

# open gateway from localhost to bastion
gateway = Net::SSH::Gateway.new('friendly-server', 'user')
# Opens a new port on the local host and forwards it to the given host/port
# via the gateway host.
gateway.open(targetdb, 1520) do |port|
db = DBI.connect(localhost, port, sid)
end

更新

无法让网关或 net-ssh forward_local 为我工作。沮丧的是,我选择了 fork ssh 隧道。不理想,但暂时有效。如果本地端口被占用,那么我想捕获该错误,但不知道如何使用此方法。

tunnel = fork do
exec 'ssh -nN -L 1520:targetdb:1520 friendly-server'
end
Process.detach(tunnel)
#do stuff
Process.kill('HUP', tunnel) if tunnel

最佳答案

我的解决方案是派生一个 ssh 命令,然后在完成后终止该 ssh 进程。

# obj_hash contains remote db details and a flag for when a tunnel is needed
local_port = 3535
if obj_hash[:tunnel]
tunnel = fork do
exec "ssh -nN -L #{local_port}:#{obj_hash[:server]}:#{obj_hash[:port]} #{obj_hash[:tunnel]} 2> /dev/null; "
end
Process.detach(tunnel)
end
# do stuff
Process.kill('HUP', tunnel) if tunnel

目前我不知道如何检查隧道是否已经在 local_port 上,所以不是一个完美的解决方案。

关于ruby - 使用 Ruby 通过网关连接到远程数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15390465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com