Non hai detto cosa succede effettivamente, ma suppongo che non ti vengano richieste le credenziali e che forse non riesce a trovare sqlplus
. Su una scatola Red Hat funziona:
#!/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
Questo sta raccogliendo i valori dall'utente sulla macchina locale per evitare che il problema "Pseudo-terminale non verrà allocato perché stdin non è un terminale".
Sta quindi configurando l'ambiente Oracle una volta sul server remoto:ciò che devi impostare dipende dal client che stai utilizzando (in particolare se stai utilizzando il client istantaneo, anche se ti stai connettendo come oracle
sembra improbabile e probabilmente puoi eseguire oraenv
).
L'ho anche ottimizzato per eseguire SQL*Plus con /nolog
e poi connect
una volta in esecuzione, quindi le credenziali non sono esposte in ps
produzione. E sono passato dalle vecchie tabs
alle più comuni user_tables
.
Gli heredoc annidati funzionano ma non sono necessari; i comandi SQL sono già stati inseriti nel posto giusto e verranno visualizzati da SQL*Plus anziché dalla shell remota.
Naturalmente, dal momento che non so quale errore stavi effettivamente vedendo, questa è in gran parte una speculazione. Probabilmente sarebbe più semplice installare il client in locale e utilizzare una connessione SQL*Net anziché SSH, ma potrebbero esserci restrizioni del firewall di cui non siamo a conoscenza.