Bash
連接到託管在不同機器上的多個 Oracle 數據庫 - 使用者名作為每個數據庫的通用密碼和不同密碼
環境:
我們在多台機器上託管了大約 100 個數據庫。所有數據庫都有共同的使用者名,但每個數據庫的密碼都不同。
問題:
如何從外部文件中一一讀取密碼和 TNS(服務名稱)並連接到每個數據庫並執行 sql 查詢並將輸出傳遞到日誌文件。
到目前為止做了什麼:
- 創建
pass
的文件包含密碼和 Service_Name 以及分隔符“:”cat pass Loufr#123:PROD Brinj#6523:TEST
- 在步驟 1 中
dblist
使用所有(與服務名稱匹配)創建另一個文件dbnames
cat dblist PROD TEST DEV QA Quality
目標:
從中讀取數據庫的名稱並從該數據庫的文件中
dblist
查找密碼。pass
使用
dbname
andpassword
連接到以下字元串中的數據庫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 作為密鑰並與之建立連接,甚至不顯示使用者名。
世界上有許多安全問題。為什麼不使用這些工具讓應用程序更安全一些呢?