Você não disse o que realmente acontece, mas suponho que você não seja solicitado a fornecer as credenciais e talvez não consiga encontrar
sqlplus
. Em uma caixa Red Hat isso funciona:#!/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/[email protected]$SID
ssh [email protected] << 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
Isso está coletando os valores do usuário na máquina local para evitar o problema 'Pseudo-terminal não será alocado porque stdin não é um terminal'.
É então configurar o ambiente Oracle uma vez no servidor remoto - o que você precisa definir depende de qual cliente você está usando (particularmente se você estiver usando o cliente instantâneo, embora se você estiver se conectando como
oracle isso parece improvável, e você provavelmente pode executar oraenv
).
Também o ajustei para executar o SQL*Plus com /nolog
e então conectar
uma vez em execução, para que as credenciais não sejam expostas no ps
resultado. E mudei das antigas guias
para as user_tables
mais comuns .
Os heredocs aninhados funcionam, mas não são necessários; os comandos SQL já estão sendo inseridos no lugar certo e serão vistos pelo SQL*Plus ao invés do shell remoto.
Claro, já que não sei qual erro você estava realmente vendo, isso é em grande parte especulação. Provavelmente seria mais simples ter o cliente instalado localmente e usar uma conexão SQL*Net em vez de SSH, mas pode haver restrições de firewall que não conhecemos.