2

我希望将一些 Oracle 组件包含在将执行一组目标的 Bash 脚本中:

  1. 以 root 身份登录到远程服务器(我的 Oracle DB 所在的位置)。
  2. 执行“su - oracle”。
  3. 以特定 Oracle 用户身份登录 sqlplus 环境。
  4. 执行 SQL 选择命令并将该命令的输出存储到变量中。
  5. 在 Bash shell 中显示该变量的结果。

我在 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(错误的文件描述符)。因此在这个 shell 中没有作业控制。

...而不是上面的两个输出之一。如果我理解正确,这可能是一个警告,取决于是否使用了特定的 shell,但大多数在线资源表明这可以忽略不计。这个警告的好处是,我上面的命令似乎实际上正在运行并将“某些东西”存储到 datasource_name 中,但这不是我想要的。

现在为了简化这个问题,我注意到当我简单地尝试从运行 bash 脚本的框中 su 到远程机器上的 oracle 时,我得到了相同的 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 生产

版权所有 (c) 1982, 2002,甲骨文公司。版权所有。

连接到:Oracle 数据库 10g 企业版版本 10.2.0.4.0 - 64 位生产,具有分区、真正应用集群、OLAP、数据挖掘和真正应用测试选项

SQL>

如果我明白为什么会出现上述问题,我就有可能弄清楚如何让我的脚本正常工作。任何建议将不胜感激!谢谢你。

4

2 回答 2

1

将第一行更改为:

ssh -t  root@5.6.7.8 "su - oracle"     

得到一个 tty 看看这是否适合你。

您可以在脚本中做的另一件事是将 stderr 也重定向到您的变量,如果您想在变量中也看到它,这对您来说似乎并非如此,尽管我过去曾这样做过一些案例。下面的评论中有一个例子。

于 2012-05-29T19:37:02.557 回答
1

这是 MySQL 的示例脚本,但可以轻松地为 Oracle 编辑:

#!/bin/bash

remote=oracle@5.6.7.8

ssh -q -t $remote <<EOF
bash <<EOFBASH
mysql <<ENDOFSQL>/tmp/out
show databases;
ENDOFSQL
EOFBASH
EOF

scp $remote:/tmp/out /tmp/out
ds=$(</tmp/out)

cat <<EOF
START OUTPUT
$ds
END OUTPUT
EOF

rm /tmp/out

经测试,效果很好。不要使用su - oracle,而是尝试直接 ssh 到 oracle 用户;)

于 2012-05-29T20:01:47.943 回答