我想在我的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
我也找到像this这样的解决方案 但不适合我。
oracle:11g ,os:fedora 18有没有可用的解决方案? 感谢。
答案 0 :(得分: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
。
嵌套的heredocs可以工作但不是必需的;已经在正确的位置输入了SQL命令,SQL * Plus而不是远程shell将会看到它们。
当然,因为我不知道你实际看到的是什么错误,这在很大程度上是猜测。在本地安装客户端并使用SQL * Net连接而不是SSH可能更简单,但可能存在我们不知道的防火墙限制。
答案 1 :(得分:0)
尝试引用此处的doc分隔符,以防止本地计算机上的陈旧变量扩展。
ssh oracle@10.116.12.26 <<'XX'