2016-06-23 4 views
0

My oracle db доступен только через сервер перепрыгивания и сбалансирован по нагрузке. В результате я запускаю следующую команду фоновую туннель в Баш:создать фоновый туннель ssh в ruby ​​

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

Перед тем, как запускать мои команды на БД с помощью SQLPlus так:

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

Это все работает отлично.

Теперь я хочу рубить эту процедуру.

При поиске документации по рубину я не мог найти, как поместить туннель в фоновом режиме (что было бы для меня предпочтительным), но я нашел документацию по локальной переадресации портов, которая, как я думал, будет эмулировать вышеупомянутый туннель и последующую команду 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 

Когда я бегу выше я получаю строку «О том, чтобы populateDB», но он висит на фактическом управлении командой Sqlplus. Что-то не так с моим кодом переадресации портов или как я могу поместить следующее:

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

в ruby ​​code?

+1

https://net-ssh.github.io/ssh/v1/chapter-4.html#s1 ⇐ почему вы ожидаете, что команда, которую вы выполняете в подоболочке _running ruby ​​process_, знает о туннеле SSH, вы только что создали? – mudasobwa

+0

туннель должен привязывать порты на моей машине к портам на серверах db через туннель через прыжок. Это работает в bash. то вызов localhost: 1521 идет без видимых проблем на ont-db01-vip: 1521 и вызов localhost: 1522 идет без видимых проблем в ont-db02-vip: 1521 – amadain

+0

подоболочка работает с моей машины, которая должна иметь привязки портов – amadain

ответ

1

Попробуйте использовать этот драгоценный камень: 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! 
0

У вас есть две проблемы.

1) Вы должны использовать «session.loop {истинно}», так что сеанс фактически петли

2) Вы не начать цикл сеанса до вашей команды Sqlplus будет сделано, но SQLPLUS нуждается сеансовый цикл (переадресация вверх).

Поэтому я предлагаю создать фоновый поток, используя Thread.new, а затем убить поток после завершения sqlplus.