Je hebt niet gezegd wat er werkelijk gebeurt, maar ik vermoed dat je niet om de inloggegevens wordt gevraagd en dat het misschien sqlplus
niet kan vinden . Op een Red Hat-doos werkt dit:
#!/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
Dit verzamelt de waarden van de gebruiker op de lokale computer om te voorkomen dat de 'Pseudo-terminal wordt niet toegewezen omdat stdin geen terminal is'-probleem.
Vervolgens wordt de Oracle-omgeving eenmaal op de externe server ingesteld - wat u moet instellen, hangt af van de client die u gebruikt (met name of u de instant-client gebruikt, maar als u verbinding maakt als oracle
dat lijkt onwaarschijnlijk, en je kunt waarschijnlijk oraenv
. uitvoeren ).
Ik heb het ook aangepast om SQL*Plus uit te voeren met /nolog
en dan connect
eenmaal actief, zodat de inloggegevens niet zichtbaar zijn in de ps
uitvoer. En ik ben overgestapt van de oude tabs
naar de meer algemene user_tables
.
De geneste heredocs werken maar zijn niet nodig; de SQL-commando's worden al op de juiste plaats ingevoerd en worden door SQL*Plus gezien in plaats van door de externe shell.
Omdat ik niet weet welke fout je eigenlijk zag, is dit natuurlijk grotendeels speculatie. Het zou waarschijnlijk eenvoudiger zijn om de client lokaal te installeren en een SQL*Net-verbinding te gebruiken in plaats van SSH, maar er kunnen firewallbeperkingen zijn waarvan we niets weten.