Sie haben nicht gesagt, was tatsächlich passiert, aber ich vermute, dass Sie nicht zur Eingabe der Anmeldeinformationen aufgefordert werden und dass sqlplus
möglicherweise nicht gefunden werden kann . Auf einer Red Hat-Box funktioniert das:
#!/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
Dies sammelt die Werte vom Benutzer auf dem lokalen Rechner, um das Problem „Pseudo-Terminal wird nicht zugewiesen, weil stdin kein Terminal ist“ zu vermeiden.
Es richtet dann die Oracle-Umgebung einmal auf dem Remote-Server ein - was Sie einstellen müssen, hängt davon ab, welchen Client Sie verwenden (insbesondere, ob Sie den Instant-Client verwenden, aber wenn Sie sich als oracle
das scheint unwahrscheinlich, und Sie können wahrscheinlich oraenv
ausführen ).
Ich habe es auch optimiert, um SQL*Plus mit /nolog
auszuführen und dann connect
einmal ausgeführt, sodass die Anmeldeinformationen nicht im ps
angezeigt werden Ausgang. Und ich bin von den alten tabs
gewechselt zu den häufigeren user_tables
.
Die verschachtelten Heredocs funktionieren, sind aber nicht notwendig; die SQL-Befehle sind bereits an der richtigen Stelle eingetragen und werden von SQL*Plus und nicht von der Remote-Shell gesehen.
Da ich natürlich nicht weiß, welchen Fehler Sie tatsächlich gesehen haben, ist dies größtenteils Spekulation. Es wäre wahrscheinlich einfacher, den Client lokal zu installieren und eine SQL*Net-Verbindung anstelle von SSH zu verwenden, aber es könnte Firewall-Einschränkungen geben, von denen wir nichts wissen.