su não pode abrir o erro de sessão ao iniciar o banco de dados do Oracle XE

3

Eu tenho um servidor RHEL 7.2 com o Oracle 11g Express Edition (11.2.0) instalado. A instalação do Oracle criou um arquivo chamado "oracle-xe" em /etc/init.d Esse é um script bash que pode ser usado para iniciar e parar o listener e o banco de dados manualmente. Quando estou conectado ao servidor, posso executar o seguinte:

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

e o banco de dados ouvinte + Oracle são iniciados sem problemas. Eu posso fazer logon usando o sqlplus e executar comandos. Estou tentando usar o chkconfig para fazer com que o oracle-xe seja executado automaticamente no início do sistema, para que eu não tenha que iniciar manualmente o listener e o banco de dados toda vez que o servidor for reinicializado. O próprio script oracle-xe é longo, mas a carne dele contém o seguinte:

#!/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

Adicionei o código $ STARTUP_LOG e o > > redirecionamento de saída para que eu pudesse resolver o que estava acontecendo. Eu adicionei o script ao chckconfig com o seguinte:

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

O seguinte comando produz a saída dada (encurtada):

dzdo chkconfig --list

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

Eu reinicializo o servidor e ele gera um arquivo de log em /home/tsm/log/oracle-xe.log com a seguinte saída:

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

e, como você pode imaginar, como resultado dessa falha de su, nem o ouvinte nem o mecanismo de banco de dados foram iniciados. Como vejo a data / hora da reinicialização no arquivo de log, sei com certeza que o script está sendo executado na inicialização. Parece-me ser um problema de permissões, que qualquer conta está sendo usada para executar scripts de inicialização na inicialização por algum motivo não pode su como $ ORACLE_OWNER, mas eu como um administrador humilde pode fazer isso muito bem a partir do prompt de comando. Entendi que o código do init é executado como root e, portanto, esse comando su deve ser executado sem problemas. Eu tenho procurado e tentando várias coisas durante a maior parte do dia tentando resolver isso, e tirei o pouco que restou do meu cabelo.

O próprio servidor está usando o DirectAuthorize para conceder permissões de acesso, e é por isso que acabo usando o dzdo em vez do sudo. Isso poderia ter algo a ver com isso?

    
por tsm 13.01.2017 / 22:57

1 resposta

0

Então eu descobri o que estava acontecendo. Quando um sistema está usando DirectAuthorize, qualquer conta que queira su como outro usuário deve usar dzdo . Isso inclui até mesmo a conta root que é usada para iniciar qualquer serviço via chkconfig durante a inicialização do sistema. Então eu mudei as seguintes linhas no meu arquivo de script 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

para isso:

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 não é um substituto direto para su , pois as opções são diferentes e você não pode simplesmente soltá-lo no lugar. Em particular, não há -c opção para executar um comando específico com dzdo . Em vez disso, o comando a ser executado é tudo o que aparece no final da instrução. A opção -s indica para executar um shell como o usuário de destino. Depois de fazer essas alterações e reinicializar, o ouvinte e a instância do banco de dados começaram como usuário "oracle" sem nenhum problema.

    
por 16.01.2017 / 19:55