启动Oracle XE数据库时su无法打开会话错误

启动Oracle XE数据库时su无法打开会话错误

我有一台安装了 Oracle 11g Express Edition (11.2.0) 的 RHEL 7.2 服务器。Oracle 的安装在 /etc/init.d 中创建了一个名为“oracle-xe”的文件。这是一个 bash 脚本,可用于手动启动和停止侦听器和数据库。当我登录到服务器时,我可以运行以下命令:

dzdo /etc/init.d/oracle-xe start

并且Oracle监听器+数据库启动没有问题。我可以使用 sqlplus 登录并执行命令。我正在尝试使用 chkconfig 来使 oracle-xe 在系统启动时自动执行,这样我就不必在每次服务器重新启动时手动启动侦听器和数据库。 oracle-xe 脚本本身很长,但其主要内容包含以下内容:

#!/bin/bash
# chkconfig: 2345 80 05

# Source fuction library
if [ -f /lib/lsb/init-functions ]
then
    . /lib/lsb/init-functions
elif [ -f /etc/init.d/functions ]
then
    . /etc/init.d/functions
fi

SU=/bin/su
ORACLE_OWNER=oracle
$ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe
LSNR=$ORACLE_HOME/bin/lsnrctl
SQLPLUS=$ORACLE_HOME/bin/sqlplus
$STARTUP_LOG=/home/tsm/log/oracle-xe.log

echo $(date) >> $STARTUP_LOG    
$SU -s /bin/bash $ORACLE_OWNER -c "$LSNR start" >> $STARTUP_LOG 2>&1
$SU -s /bin/bash $ORACLE_OWNER -c "$SQLPLUS -s /nolog @$ORACLE_HOME/config/scripts/startdb.sql" >> $STARTUP_LOG 2>&1

我添加了 $STARTUP_LOG 代码和 >> 输出重定向,以便我可以弄清楚发生了什么。我将脚本添加到 chckconfig 中,内容如下:

cd /etc/init.d
dzdo chmod 750 oracle-xe
dzdo chkconfig --add oracle-xe
dzdo chkconfig oracle-xe on

以下命令产生给定的(缩短的)输出:

dzdo chkconfig --list

oracle-xe       0:off    1:off   2:on   3:on   4:on   5:on  6:off

我重新启动服务器,它在 /home/tsm/log/oracle-xe.log 生成一个日志文件,输出如下:

Fri Jan 13 15:03:58 CST 2017
su: cannot open session: Permission denied
su: cannot open session: Permission denied

正如您可能猜到的那样,由于此 su 失败,侦听器和数据库引擎都没有启动。由于我在日志文件中看到重新启动日期/时间,因此我确信脚本在启动时正在执行。在我看来,这是一个权限问题,无论出于某种原因在启动时用于执行 init 脚本的任何帐户都不能 su 作为 $ORACLE_OWNER,但我作为一个低级管理员可以从命令提示符中很好地执行此操作。据我了解,初始化代码是作为 root 执行的,因此这个 su 命令运行应该没有问题。在一天的大部分时间里,我一直在寻找和尝试各种方法,试图解决这个问题,并拔掉了我仅存的一点头发。

服务器本身使用 DirectAuthorize 来授予访问权限,这就是我最终使用 dzdo 而不是 sudo 的原因。难道这跟这有什么关系吗?

答案1

所以我明白发生了什么事。当系统使用 DirectAuthorize 时,任何想要su作为其他用户的帐户必须代替使用dzdo。这甚至包括用于在系统引导期间通过 chkconfig 启动任何服务的 root 帐户。因此,我在 oracle-xe 脚本文件中更改了以下几行:

$SU -s /bin/bash $ORACLE_OWNER -c "$LSNR start" >> $STARTUP_LOG 2>&1
$SU -s /bin/bash $ORACLE_OWNER -c "$SQLPLUS -s /nolog @$ORACLE_HOME/config/scripts/startdb.sql" >> $STARTUP_LOG 2>&1

改为:

dzdo -s -u $ORACLE_OWNER $LSNR start >> $STARTUP_LOG 2>&1
dzdo -s -u $ORACLE_OWNER $SQLPLUS -s /nolog @ORACLE_HOME/config/scripts/startdb.sql >> @STARTUP_LOG 2>&1

dzdo不是 的直接替代品su,因为选项不同,您不能简单地将其放在适当的位置。特别是,没有使用-c运行特定命令的选项dzdo。相反,要执行的命令是出现在语句末尾的所有内容。该-s开关指示以目标用户身份运行 shell。进行这些更改并重新启动后,侦听器和数据库实例以用户“oracle”身份启动,没有任何故障。

相关内容