Bạn chưa nói điều gì thực sự xảy ra, nhưng tôi đoán bạn không được nhắc nhập thông tin đăng nhập và có thể nó không thể tìm thấy sqlplus
. Trên hộp Red Hat, điều này hoạt động:
#!/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
Điều này đang thu thập các giá trị từ người dùng trên máy cục bộ để tránh vấn đề 'Pseudo-terminal sẽ không được cấp phát vì stdin không phải là một thiết bị đầu cuối'.
Sau đó, nó sẽ thiết lập môi trường Oracle một lần trên máy chủ từ xa - những gì bạn cần thiết lập tùy thuộc vào ứng dụng khách bạn đang sử dụng (đặc biệt là liệu bạn có đang sử dụng ứng dụng khách tức thì hay không, mặc dù nếu bạn đang kết nối bằng oracle
điều đó có vẻ khó xảy ra và bạn có thể chạy oraenv
).
Tôi cũng đã chỉnh nó để chạy SQL * Plus với /nolog
và sau đó connect
khi đang chạy, vì vậy thông tin đăng nhập không được hiển thị trong ps
đầu ra. Và tôi đã chuyển từ các tab tabs
cũ đến user_tables
phổ biến hơn .
Các heredocs lồng nhau hoạt động nhưng không cần thiết; các lệnh SQL đã được nhập vào đúng nơi và sẽ được SQL * Plus nhìn thấy chứ không phải là trình bao từ xa.
Tất nhiên, vì tôi không biết bạn thực sự thấy lỗi gì nên phần lớn chỉ là suy đoán. Có lẽ sẽ đơn giản hơn nếu cài đặt ứng dụng khách cục bộ và sử dụng kết nối SQL * Net thay vì SSH, nhưng có thể có những hạn chế về tường lửa mà chúng tôi không biết.