你还没有说实际发生了什么,但我猜你没有被提示输入凭据,而且它可能找不到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 可能会更简单,但可能存在我们不知道的防火墙限制。