Du har inte sagt vad som faktiskt händer, men jag antar att du inte uppmanas att ange referenserna, och att den kanske inte kan hitta sqlplus
. På en Red Hat-låda fungerar detta:
#!/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
Detta samlar in värdena från användaren på den lokala datorn för att undvika att "Pseudoterminalen kommer inte att tilldelas eftersom stdin inte är ett terminalproblem".
Det är sedan att ställa in Oracle-miljön en gång på fjärrservern - vad du behöver ställa in beror på vilken klient du använder (särskilt om du använder instant-klienten, men om du ansluter som oracle det verkar osannolikt, och du kan förmodligen köra
oraenv
).
Jag har också anpassat den för att köra SQL*Plus med /nolog
och sedan anslut
när den körs, så att referenserna inte visas i ps
produktion. Och jag har bytt från de gamla flikarna
till de vanligare user_tables
.
De kapslade heredocs fungerar men är inte nödvändiga; SQL-kommandona läggs redan in på rätt plats och kommer att ses av SQL*Plus snarare än av fjärrskalet.
Naturligtvis, eftersom jag inte vet vilket fel du faktiskt såg är detta till stor del spekulationer. Det skulle förmodligen vara enklare att ha klienten installerad lokalt och använda en SQL*Net-anslutning snarare än SSH, men det kan finnas brandväggsbegränsningar som vi inte känner till.