在ruby中创建一个后台ssh隧道

时间:2016-06-23 07:46:27

标签: ruby portforwarding ssh-tunnel

我的oracle db只能通过跳出服务器访问并且是负载平衡的。因此,我在bash中运行以下后台隧道命令:

ssh ${jumpoffUser}@${jumpoffIp} -L1521:ont-db01-vip:1521 -L1522:ont-db02-vip:1521 -fN

在我使用sqlplus在db上运行命令之前:

sqlplus #{@sqlUsername}/#{@sqlPassword}@'#{@sqlUrl}' @scripts/populateASDB.sql

一切正常。

现在我想擦除这个程序。

在查找关于ruby的文档时,我找不到如何将隧道放在后台(这将是我的偏好),但我找到了本地端口转发的文档,我认为这将模拟上面的隧道和后续的sqlplus命令。

这是我的代码:

Net::SSH.start( @jumpoffIp, @jumpoffUser ) do |session|
  session.forward.local( 1521, 'ont-db01-vip', 1521 )
  session.forward.local( 1522, 'ont-db02-vip', 1521 )
  puts "About to populateDB"
  res = %x[sqlplus #{@sqlUsername}/#{@sqlPassword}@'#{@sqlUrl}' @scripts/populateASDB.sql > output.txt]
  puts "populateDb output #{res}"
  session.loop
end

当我运行以上内容时,我得到了一行"即将填充数据库"但它依赖于sqlplus命令的实际运行。我的端口转发代码是否有问题,或者我如何处理以下内容:

ssh ${jumpoffUser}@${jumpoffIp} -L1521:ont-db01-vip:1521 -L1522:ont-db02-vip:1521 -fN

进入ruby代码?

A

2 个答案:

答案 0 :(得分:1)

尝试使用此gem:https://github.com/net-ssh/net-ssh-gateway/

require 'net/ssh/gateway'

gateway = Net::SSH::Gateway.new(@jumpoffIp, @jumpoffUser)
gateway.open('ont-db01-vip', 1521, 1521)
gateway.open('ont-db02-vip', 1521, 1521)

res = %x[sqlplus #{@sqlUsername}/#{@sqlPassword}@'#{@sqlUrl}' @scripts/populateASDB.sql > output.txt]
puts "populateDb output #{res}"

gateway.shutdown!

答案 1 :(得分:0)

你有两个问题。

1)您需要使用' session.loop {true}'这样会话实际上循环

2)在sqlplus命令完成之前,你不会开始循环会话,但是sqlplus需要会话循环(转发才能启动)。

所以我建议使用Thread.new创建一个后台线程,然后在sqlplus完成后终止该线程。