0

bash スクリプトの sqlplus コマンドで変数を渡したいのですが、答えは返されるかもしれませんが、うまくいきません。

私はこのようなことを試しました

#!/bin/bash
ssh oracle@10.116.12.26 <<XX
echo Please enter an Oracle Username:
read USERNAME

echo "Please enter the Oracle Username's Password:"
read -s PASS 

SID=XE

export conn_str=$USERNAME/$PASS@$SID

sqlplus $conn_str  << EOF
select * FROM tabs;

exit
EOF
XX

も試した

sqlplus $USERNAME/$PASS@SID            #with option -s  and -l

私もこのような解決策を見つけまし たが、うまくいきませんでした。

オラクル: 11g、OS: フェドーラ 18

これに利用できる解決策はありますか? ありがとう。

4

2 に答える 2

1

実際に何が起こるかは言われていませんが、資格情報の入力を求められていないのではないかと思いますsqlplus.. Red Hat ボックスでは、次のように動作します。

#!/bin/bash
echo Please enter an Oracle Username:
read USERNAME
echo "Please enter the Oracle Username's Password:"
read -s PASS
SID=XE
conn_str=$USERNAME/$PASS@$SID

ssh oracle@10.116.12.26 << EOF
# set these for your specific environment
ORACLE_HOME=<path to ORACLE_HOME>
PATH=$PATH:$ORACLE_HOME/bin # or without .../bin depending on client
TNS_ADMIN=<path to tnsnames.ora directory, if not default>

sqlplus -s /nolog
connect $conn_str
select * FROM user_tables;
exit
EOF

これは、「stdin が端末ではないため、疑似端末が割り当てられない」問題を回避するために、ローカル マシン上のユーザーから値を収集しています。

次に、リモートサーバーでOracle環境を1回設定します-設定する必要があるものは、使用しているクライアントによって異なります(特に、インスタントクライアントを使用しているかどうかに依存しますが、接続しoracleている場合はそうではないようです)おそらく実行できますoraenv)。

また、SQL*Plus を実行してから一度実行するように微調整した/nologのでconnect、資格情報がps出力に表示されません。tabsそして、古いものからより一般的なものに切り替えましたuser_tables

ネストされたヒアドキュメントは機能しますが、必須ではありません。SQL コマンドはすでに適切な場所に入力されており、リモート シェルではなく SQL*Plus によって認識されます。

もちろん、実際にどのようなエラーが表示されたのかはわかりませんので、これは主に憶測です。クライアントをローカルにインストールし、SSH ではなく SQL*Net 接続を使用する方がおそらく簡単ですが、私たちが知らないファイアウォールの制限がある可能性があります。

于 2013-09-23T08:25:32.330 に答える
0

ローカル マシンでの古い変数の展開を防ぐために、ヒア ドキュメントの区切り記号を引用してみてください。

ssh oracle@10.116.12.26 <<'XX'
于 2013-09-23T08:52:17.933 に答える