2016-06-23 11 views
0

私のoracle dbは、ジャンプオフ・サーバ経由でのみアクセス可能であり、負荷分散されています。その結果、私はbashで、次のバックグラウンドトンネルコマンドを実行します。ルビーでバックグラウンドsshトンネルを作成する

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

私はそうのようなSQLPLUSを使用してDBに私のコマンドを実行する前に:

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

このすべてが正常に動作します。

私はこの手順をrubisizeしたいと思います。

ルビーのドキュメントを調べると、バックグラウンドにトンネルを配置する方法が見つかりませんでしたが(私の好みになります)、上記のトンネルとその後の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 

ルビーコードには?

+1

https://net-ssh.github.io/ssh/v1/chapter-4.html#s1 whyなぜあなたは_running ruby​​ process_のサブシェルで実行するコマンドがあなたのSSHトンネルを認識していると思いますか?ちょうど確立された? – mudasobwa

+0

トンネルは、私のマシン上のポートを、jumpoffを通じてトンネル経由で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

次の2つの問題を抱えています。

1)あなたが使用する必要があります「session.loop {本当}」ので、セッションが実際に

2)あなたはSQLPLUSコマンドまでのセッションをループ開始されませんが行われますが、SQLPLUSが必要でループすることをセッションルーピング(フォワーディングをアップする)。

したがって、Thread.newを使用してバックグラウンドスレッドを作成してから、sqlplusが完了するとスレッドを強制終了することをお勧めします。

関連する問題