Nie powiedziałeś, co się właściwie dzieje, ale domyślam się, że nie jesteś proszony o podanie danych uwierzytelniających i może nie można znaleźć sqlplus
. Na pudełku Red Hat to działa:
#!/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
Jest to zbieranie wartości od użytkownika na komputerze lokalnym, aby uniknąć problemu „Pseudoterminal nie zostanie przydzielony, ponieważ stdin nie jest terminalem”.
Następnie konfiguruje środowisko Oracle raz na zdalnym serwerze — to, co należy ustawić, zależy od używanego klienta (szczególnie, czy używasz klienta natychmiastowego, ale jeśli łączysz się jako oracle wydaje się to mało prawdopodobne i prawdopodobnie możesz uruchomić
oraenv
).
Zmodyfikowałem go również, aby uruchamiał SQL*Plus z /nolog
a następnie połącz
po uruchomieniu, więc poświadczenia nie są ujawniane w ps
wyjście. I przełączyłem się ze starych kart
do bardziej popularnych tabeli_użytkowników
.
Zagnieżdżeni heredocy działają, ale nie są potrzebni; polecenia SQL są już wprowadzane we właściwym miejscu i będą widziane przez SQL*Plus, a nie przez zdalną powłokę.
Oczywiście, ponieważ nie wiem, jaki błąd faktycznie widziałeś, jest to w dużej mierze spekulacja. Prawdopodobnie prościej byłoby mieć klienta zainstalowanego lokalnie i używać połączenia SQL*Net zamiast SSH, ale mogą istnieć ograniczenia zapory ogniowej, o których nie wiemy.