一連の目標を実行するBashスクリプト内にいくつかのOracleコンポーネントを含めることを検討しています。
- rootとしてリモートサーバー(私のOracle DBが存在する場所)にログインします。
- 「su--oracle」を実行します。
- 特定のOracleユーザーとしてsqlplus環境にログインします。
- SQL selectコマンドを実行し、そのコマンドの出力を変数に格納します。
- その変数の結果をBashシェルに表示します。
私はここでstackoverflowに関するいくつかの例を調べましたが、その多くはコマンドの実行を超えているように見えますが、必ずしもユーザーに出力を表示する方法を詳しく説明しているわけではありません(まだいくつか調べていますが)。たとえば、すべての鍵交換が事前に設定されていると仮定すると、次の方法を使用できます。
#!/bin/sh
ssh -q root@5.6.7.8
sqlplus ABC/XYZ@core <<ENDOFSQL
select CREATE_DATE from PREPAID_SUBSCRIBER where MSISDN='12345678912';
exit;
ENDOFSQL
代わりに、これを設定しようとした方法は次のとおりです。
#!/bin/sh
datasource_name=`echo "select CREATE_DATE from PREPAID_SUBSCRIBER where MSISDN='12345678912';" | ssh -q 5.6.7.8 "su - oracle -c 'sqlplus -S ABC/XYZ@core'" | tail -2 | head -1`
理想的には、datasource_name変数は次のいずれかの値を取る必要があります。
no rows selected
または、テーブル内にエントリがある場合:
CREATE_DATE
-------------------
07-06-2009 18:04:48
tailおよびheadコマンドは、出力の空の行を削除するためのものであり、ssh-qおよびsqlplus-Sオプションは警告を無視するためのものです。
ただし、そのコマンドを実行して、次のことを実行すると、次のようになります。
echo "${datasource_name}"
わかった...
警告:tty(不正なファイル記述子)にアクセスできません。したがって、このシェルにはジョブ制御はありません。
...上記の2つの出力の代わりに。私が正しく理解していれば、これは特定のシェルが使用されているかどうかに応じて発生する可能性のある警告ですが、ほとんどのオンラインソースはこれを無視できることを示しています。この警告の良いところは、上記のコマンドが実際に実行され、datasource_nameに「何か」を格納しているように見えることですが、それは私が望んでいることではありません。
この問題を単純化するために、bashスクリプトが実行されているボックスからリモートマシンでoracleにsuを実行しようとすると、同じtty警告が表示されることに気付きました。
ssh root@5.6.7.8 "su - oracle"
Warning: no access to tty (Bad file descriptor).
Thus no job control in this shell.
次のことを行うと、実際には問題なくsqlplus環境に正常にアクセスできます。
ssh -q root@5.6.7.8 "su - oracle -c 'sqlplus ABC/XYZ@core'"
SQL * Plus:リリース9.2.0.4.0-2012年5月29日火曜日12:35:06に本番環境
Copyright(c)1982、2002、OracleCorporation。全著作権所有。
接続先:Oracle Database 10g Enterprise Editionリリース10.2.0.4.0-パーティショニング、Real Application Clusters、OLAP、データマイニング、およびRealApplicationTestingオプションを使用した64ビット本番環境
SQL>
上記の問題が発生している理由を理解すれば、スクリプトを正しく機能させる方法を理解できる可能性があります。任意の提案をいただければ幸いです!ありがとうございました。