【bash・cshスクリプト実装】OracleDB接続

### 背景
OracleデータベースにCLI接続時、パスワードを直書きでログインするとLinuxのコマンド入力履歴にパスワードが残ってしまうため、セキュリティリスクがあります。
パスワードを外部から読み取れないようbash・cshスクリプト記載しておき、
パスワードファイルを参照することで、Oracleデータベースに接続する方法を検討します。

参考：https://www.rstone-jp.com/column/110007/

---

### 前提
* Oracleクライアントを搭載するサーバで実行する想定で作成します
* DBサーバが2つある想定（今回はProd、dis）とします。
* OracleのSYS、SYSTEMユーザではなく、一般ユーザ（今回はdbuserprod、dbuserdis）を対象とします。
https://docs.oracle.com/cd/E57425_01/121/ADMQS/GUID-CF1CD853-AF15-41EC-BC80-61918C73FDB5.htm
* 実際にOracleDatabaseへ接続はせず、echoでどのようなコマンドになるかを確かめます
* 今回はローカルネーミング（tnsnames.oraがある前提）での実装とします
    * 簡易接続ネーミング
        * ユーザ名[/パスワード]@接続先ホスト名[:リスナーポート]/[サービス名]
    * ローカルネーミング
        * ユーザ名[/パスワード]@ネットサービス名
    * 参考：https://qiita.com/mi-kana/items/0f79cafed1761a4531b1


---

### 内容
bashスクリプトとcshスクリプト両方のケースを考えました。

---

#### cshの場合

##### DB接続スクリプト

```
[root@t_kyn_homeserver ~]# cat ./mainDBconnectors.csh
#!/bin/csh

# 引数を表示
echo maincsh"第1引数: $1"
echo maincsh"第2引数: $2"

source .envtest.csh $1 $2

# OracleDBに接続する処理
set username = $1
set netservicename = $2

echo "OracleDBに接続します..."

# SQLPlusを使ってOracleDBに接続
echo sqlplus -S ${username}/${dbpass}@${netservicename} @SQLFILE.sql

echo "OracleDBから切断しました。"
echo "THIS DB SCHEMA PASSWORD IS "${dbpass}" ,maincsh"
[root@t_kyn_homeserver ~]#
```

---

##### パスワード取得スクリプト
```
[root@t_kyn_homeserver ~]# cat .envtest.csh
#!/bin/csh

# 引数を表示
echo subcshshell"第1引数: $1"
echo subcshshell"第2引数: $2"

# 引数に応じて処理を分岐
if ($1 == "dbuserprod" && $2 == "prodservice") then
    set dbpass = "dbuserprodpasswd"
else if ($1 == "dbuserdis" && $2 == "disservice") then
    set dbpass = "dbuserdispasswd"
else
    echo "無効な引数です"
    exit 1
endif

# パスワードを表示
echo "DBパスワード: $dbpass"

[root@t_kyn_homeserver ~]#
```


---

##### 実行結果

```
[root@t_kyn_homeserver ~]# ./mainDBconnectors.csh dbuserprod prodservice
maincsh第1引数: dbuserprod
maincsh第2引数: prodservice
subcshshell第1引数: dbuserprod
subcshshell第2引数: prodservice
DBパスワード: dbuserprodpasswd
OracleDBに接続します...
sqlplus -S dbuserprod/dbuserprodpasswd@prodservice @SQLFILE.sql
OracleDBから切断しました。
THIS DB SCHEMA PASSWORD IS dbuserprodpasswd ,maincsh
[root@t_kyn_homeserver ~]#
```

---

#### bashの場合


##### DB接続スクリプト

```
[root@t_kyn_homeserver ~]# cat mainDBconnectors.sh
#!/bin/bash

# 引数を表示
echo mainbash"第1引数: $1"
echo mainbash"第2引数: $2"

. .envtest.sh $1 $2

# OracleDBに接続する処理
username=$1
netservicename=$2

echo "OracleDBに接続します..."

# SQLPlusを使ってOracleDBに接続
echo sqlplus -S ${username}/${dbpass}@${netservicename} @SQLFILE.sql

echo "OracleDBから切断しました。"
echo "THIS DB SCHEMA PASSWORD IS "${dbpass}" ,mainbash"
[root@t_kyn_homeserver ~]#
```

---

##### パスワード取得スクリプト

```
[root@t_kyn_homeserver ~]# cat .envtest.sh
#!/bin/bash

# 引数を表示
echo subbashshell"第1引数: $1"
echo subbashshell"第2引数: $2"

# 引数に応じて処理を分岐
if [ "$1" == "dbuserprod" ] && [ "$2" == "prodservice" ]; then
    dbpass="dbuserprodpasswd"
elif [ "$1" == "dbuserdis" ] && [ "$2" == "disservice" ]; then
    dbpass="dbuserdispasswd"
else
    echo "無効な引数です"
    exit 1
fi

# パスワードを表示
echo "DBパスワード: $dbpass"

[root@t_kyn_homeserver ~]#
```

---

##### 実行結果
```
[root@t_kyn_homeserver ~]# ./mainDBconnectors.sh dbuserprod prodservice
mainbash第1引数: dbuserprod
mainbash第2引数: prodservice
subbashshell第1引数: dbuserprod
subbashshell第2引数: prodservice
DBパスワード: dbuserprodpasswd
OracleDBに接続します...
sqlplus -S dbuserprod/dbuserprodpasswd@prodservice @SQLFILE.sql
OracleDBから切断しました。
THIS DB SCHEMA PASSWORD IS dbuserprodpasswd ,mainbash
[root@t_kyn_homeserver ~]# 
```

---

### cshとbashとの違い

```
[root@t_kyn_homeserver ~]# sdiff -w 150 mainDBconnectors.csh mainDBconnectors.sh
#!/bin/csh                                                                |     #!/bin/bash

# 引数を表示                                                                    # 引数を表示
echo maincsh"第1引数: $1"                                                 |     echo mainbash"第1引数: $1"
echo maincsh"第2引数: $2"                                                 |     echo mainbash"第2引数: $2"

source .envtest.csh $1 $2                                                 |     . .envtest.sh $1 $2

# OracleDBに接続する処理                                                        # OracleDBに接続する処理
set username = $1                                                         |     username=$1
set netservicename = $2                                                       |     netservicename=$2

echo "OracleDBに接続します..."                                                  echo "OracleDBに接続します..."

# SQLPlusを使ってOracleDBに接続                                                 # SQLPlusを使ってOracleDBに接続
echo sqlplus -S ${username}/${dbpass}@${netservicename} @SQLFILE.sql                echo sqlplus -S ${username}/${dbpass}@${netservicename} @SQLFILE.sql

echo "OracleDBから切断しました。"                                               echo "OracleDBから切断しました。"
echo "THIS DB SCHEMA PASSWORD IS "${dbpass}"maincsh"                                     |     echo "THIS DB SCHEMA PASSWORD IS "${dbpass}"mainbash"
[root@t_kyn_homeserver ~]#

[root@t_kyn_homeserver ~]# sdiff -w 150 .envtest.csh .envtest.sh
#!/bin/csh                                                                |     #!/bin/bash

# 引数を表示                                                                    # 引数を表示
echo subcshshell"第1引数: $1"                                             |     echo subbashshell"第1引数: $1"
echo subcshshell"第2引数: $2"                                             |     echo subbashshell"第2引数: $2"

# 引数に応じて処理を分岐                                                        # 引数に応じて処理を分岐
if ($1 == "dbuserprod" && $2 == "prodservice") then                       |     if [ "$1" == "dbuserprod" ] && [ "$2" == "prodservice" ]; then
    set dbpass = "dbuserprodpasswd"                                       |         dbpass="dbuserprodpasswd"
else if ($1 == "dbuserdis" && $2 == "disservice") then                    |     elif [ "$1" == "dbuserdis" ] && [ "$2" == "disservice" ]; then
    set dbpass = "dbuserdispasswd"                                        |         dbpass="dbuserdispasswd"
else                                                                            else
    echo "無効な引数です"                                                           echo "無効な引数です"
    exit 1                                                                          exit 1
endif                                                                     |     fi

# パスワードを表示                                                              # パスワードを表示
echo "DBパスワード: $dbpass"                                                    echo "DBパスワード: $dbpass"

[root@t_kyn_homeserver ~]#
```

### あとがき
* パスワードを記載するスクリプトは他のユーザから読み取りできないようにアクセス権限を変更することを推奨します
    * chmodコマンドで可能で、グループとその他のユーザーは読取・実行・書込権限なしにします。
* Oracleクライアントを用いた接続に関しては、下記環境変数の読み込みが必要です。
    * ORACLE_HOME
    * TNS_ADMIN
    * LD_LIBRARY_PATH
    * NLS_LANG
    * 環境変数PATH
* 実際にOracleデータベースに接続したい場合はenvtest.sh（exportを使う）、envtest.csh（setenvを使う）に定義するか、bash_profileで定義してもいいかと思います。
* cshは主にC言語に似た文法なのに対して、bashは多くの付加機能がありLinuxの標準シェルとして使用されています。
* bashもcshもコンパイルが不要で、ファイル操作や処理の定期実行を行う際に有効です。どちらでもよいと思います。