psql接続時に対話でパスワードを入力しない

psql経由でSQLを実行するときに、対話でのパスワード入力をせずにワンライナーで行いたい。pg_hba.confの設計・設定次第だが、trust以外の設定(md5等)ではpsql接続時にパスワード入力を求められる。手動操作やJDBC接続時などは問題ないが、Linuxプラットフォームで運用バッチ(シェルスクリプト等)でpsqlを使用した接続を行う場合に問題となることがある。

psqlの仕様として、パスワードを指定するオプションがない(mysqlの-p/--passwordオプションに相当するオプションがない)。一見紛らわしいが、-W/--password は、パスワード入力を要求させるオプションであってパスワードをコマンドライン引数で与えるものではない。

対応方法:$HOME/.pgpassファイルの使用

実行したいユーザのHOMEディレクトリに、.pgpassファイルを作成する。セキュリティを考慮し、ファイル権限は600とする。


$ vi ~/.pgpass
$ chmod 600 ~/.pgpass

.pgpassファイルの書式は以下の通り。複数定義したい場合はこの書式で複数行記述するだけ。


DBサーバホスト名:接続ポート番号:DB名:DBロール名:パスワード
※注意、特定バージョンまでは$HOME環境変数を参照するので、cronに設定する場合は$HOMEにも気をつけること!

対応方法(2):PGPASSWD環境変数の設定

環境変数の設定はディストリビューションにより異なるので注意すること。viで~/.bash_profile、またはそこから読み込まれる|/.bashrcにて、以下の内容を設定する。この場合も、上記の方式同じようにファイルのパーミッションは600とするのがよさそう。


export PGPASSWD=パスワード

あとがき

上記の処理を施すことで、pg_hba.conf側の設定をバッチ実行用のDBロールを含む全DBロールの認証方式をtrust以外の設定にしても、問題なくバッチを動作させることができる。
セキュリティ設計上 バッチ実行用ユーザでリモートログインされること自体を防ぐことが必要になる場合は、実行するOSユーザのパスワードをpasswd -dで削除し、必ずsu - root後しか当該ユーザにスイッチできないようにするのがよい。※ssh側でのPermitRootLogin/PermitEmptyPasswords設定、PAM側でのsu許可ユーザ制限をすることで、セキュリティを担保できる。