Bash

連接到託管在不同機器上的多個 Oracle 數據庫 - 使用者名作為每個數據庫的通用密碼和不同密碼

  • September 16, 2021

環境:

我們在多台機器上託管了大約 100 個數據庫。所有數據庫都有共同的使用者名,但每個數據庫的密碼都不同。

問題:

如何從外部文件中一一讀取密碼和 TNS(服務名稱)並連接到每個數據庫並執行 sql 查詢並將輸出傳遞到日誌文件。

到目前為止做了什麼:

  1. 創建pass的文件包含密碼和 Service_Name 以及分隔符“:”
cat pass
Loufr#123:PROD
Brinj#6523:TEST
  1. 在步驟 1 中dblist使用所有(與服務名稱匹配)創建另一個文件dbnames
cat dblist
PROD
TEST
DEV
QA
Quality

目標:

從中讀取數據庫的名稱並從該數據庫的文件中dblist查找密碼。pass

使用dbnameandpassword連接到以下字元串中的數據庫

sqlplus -s dbsnmp@${TNS}/${Password}
spool output.log
@query.sql
exit

這個腳本應該可以解決問題:

while read TNS; do
   Password="$(sed -n "s/\(.*\):${TNS}$/\1/p" pass)"
   [ "$Password" ] && sqlplus -s dbsnmp@${TNS}/${Password} << EOF
whenever sqlerror exit sql.sqlcode;
set echo off 
set heading off

spool output.log
@query.sql

exit;
EOF
done < dblist

如果您只是要求一個腳本來解析包含憑據的文件。您還可以看到:在 shell 腳本中連接到 sqlplus 並執行 SQL 腳本

有很多方法可以獲得你想要的東西,但是儲存明文密碼或在命令行上顯示它們的“解決方案”是錯誤的。自許多版本以來,都有一種儲存密碼的解決方案,稱為 oracle wallet。https://docs.oracle.com/database/121/DBIMI/walet.htm#DBIMI10236 使用它可以使腳本編寫變得更加容易,因為您可以將登錄程式碼限制為:“sqlplus /@tns”這將探勘錢包中的憑據使用 tns 作為密鑰並與之建立連接,甚至不顯示使用者名。

世界上有許多安全問題。為什麼不使用這些工具讓應用程序更安全一些呢?

引用自:https://dba.stackexchange.com/questions/299696