こんにちは、河野です。
集計処理などをバッチで実行する時に、パスワードを入力せずにデータベースに接続する必要がありますよね。ついつい忘れてしまうので、備忘録としてまとめてみました。
PostgreSQLの場合
パスワードファイルを使用します。実行ユーザーのホームディレクトリに.pgpass
というファイルを作って、その中に以下の書式で設定を記述します。
1 |
hostname:port:database:username:password |
コロンで区切られたパスワード以外の各項目は*
で省略できます。1つのアカウントで複数のデータベースを管理している場合、必要に応じて設定を書き足していけばOKです。
こんな感じです。
1 2 3 |
$cat $HOME/.pgpass host1:*:db1:kawano:hogehoge host2:*:db2:kentaro:piyopiyo |
このパスワードファイルは権限を600に設定しておく必要があります。権限が600でない場合は使用されません。ターミナル上でpsqlコマンドを実行すると「アクセス権限がちゃんと設定されていないよ」というメッセージが出ますので、事前に確認してみてください。
また、パスワードファイルはデフォルトでは、$HOME/.pgpass
を参照しますが、PGPASSFILE
という環境変数が指定されていれば、そちらを参照するようになります。
cf: PostgreSQL 9.2.0文書 パスワードファイル
MySQLの場合
ユーザー固有の設定ファイルを使用することで、パスワードの入力を省くことができます。
MySQLは実行ユーザーの$HOME/.my.cnf
ファイルを参照するので、クライアントの設定としてパスワードを記述します。
1 2 3 4 |
$ cat $HOME/.my.cnf [client] password="hogehoge" その他のオプション… |
あくまでも設定を記述するための方法で、パスワード専用ではないということに注意してください。
また、ここで設定しているパスワードは実行時のデフォルトパスワードになりますので、MySQL上の異なるユーザーを使用したい時には使えません。
そんな時には、--defaults-extra-file オプションを使いますが、注意が必要です。MySQLでは設定ファイルの読み込み順序が決まっており、2重に設定されている項目は、後から設定されたものが優先されるからです。
defaults-extra-file オプションで指定したファイルと、.my.cnfでは、.my.cnfが後から読み込まれます。どちらにもパスワードが設定されていると、.my.cnfのパスワードが使用されるので意味がありません。そのために.my.cnfにも修正が必要になります。
1 2 3 |
$ cat $HOME/.my.cnf [client] その他のオプション… |
1 2 3 |
$ cat $HOME/default-pass.my.cnf [client] password="hogehoge" |
1 2 3 |
$ cat $HOME/another-pass.my.cnf [client] password="piyopiyo" |
パスワード以外にも、2重に読み込ませたくないオプションがある場合には、それらも切り分ける必要があります。
各ファイルの設定ができたら、以下のように実行します。
1 2 |
mysql --defaults-extra-file=/home/kawano/default-pass.my.cnf -u dbuser1 db1 mysql --defaults-extra-file=/home/kawano/another-pass.my.cnf -u dbuser2 db2 |
という感じです。
なんだか面倒くさいですね。いっそのこと、Linuxのユーザーを別途作って、それぞれの.my.cnfを設定した方が良いかもしれませんね…。
cf: MySQL :: MySQL 5.1 リファレンスマニュアル :: 3.3.2 オプションファイルの使用
どちらにも推奨されていない方法
PostgreSQLでもMySQLでも、ある環境変数にパスワードを設定しておくとそれが使用される、という設定があります。推奨されていない方法ですので、使用しないようにしましょう。
以上、パスワードを省く方法でした!