我的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
答案 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完成后终止该线程。