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,操作系统:fedora 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

这是在本地机器上收集用户的值,以避免“伪终端将不会被分配,因为标准输入不是终端”问题。

然后在远程服务器上设置一次 Oracle 环境 - 您需要设置的内容取决于您使用的客户端(特别是您是否使用即时客户端,但如果您正在连接,因为oracle这似乎不太可能,并且你可能可以运行oraenv)。

我还对其进行了调整以运行 SQL*Plus,/nolog然后connect运行一次,因此凭据不会在ps输出中公开。而且我已经从旧的切换tabs到更常见的user_tables

嵌套的 heredocs 工作但不是必需的;SQL 命令已经在正确的位置输入,并且将被 SQL*Plus 而不是远程 shell 看到。

当然,由于我不知道您实际看到的是什么错误,这在很大程度上是猜测。将客户端安装在本地并使用 SQL*Net 连接而不是 SSH 可能会更简单,但可能存在我们不知道的防火墙限制。

于 2013-09-23T08:25:32.330 回答
0

尝试引用您的此处文档分隔符以防止在本地计算机上进行过时的变量扩展。

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