かえでBlog

色々なことを徒然と……

【PostgreSQL】psqlにてパスワードを省略する方法

   

PostgreSQLのpsqlのコマンドはMySQLのように引数でパスワードを設定することができない。

そのため、通常は対話形式でパスワードを入力することになるが、バッチ処理を行う際は結構めんどくさい。

対話形式なしで作業できるかと探してみるとどうやら.pgpassに入れる方法と環境変数に入れる方法で対処ができるみたいです。

.pgpassに入れる方法

.bash_profileや.bashrcと同じホームディレクトリに.pgpassファイルを追加することでパスワードを省略することができます。

.pgpassに記述する内容は以下の通り

ホスト名:ポート:データベース:ユーザ:パスワード
例)192.168.1.**:5432:dbname:postgres:password

実行結果は以下の通り

# psql -h 192.168.1.** -U postgres dbname -c "select now()"
              now
-------------------------------
 2015-10-26 23:06:46.223393+09
(1 row)

.pgpassの権限は600にする必要があります。600以外の場合は警告が表示され、パスワード入力画面が求められます。

# psql -h 192.168.1.** -U postgres dbname -c 'select now()'
WARNING: password file "/root/.pgpass" has group or world access; permissions should be u=rw (0600) or less
Password for user postgres:

atやcronコマンドを使う場合でも問題なく使用できます。

権限が600なのでスーパユーザ以外はパスワードが知られないという利点もあります。

.pgpassの置き場所変更は環境変数:PGPASSFILEにて設定可能です。

環境変数に入れる方法

環境変数にパスワードを入れることによってパスワードを省略することができます。

記述内容は以下の通り

#PostgreSQLのパスワードを環境変数に挿入
export PGPASSWORD=password

実行結果

# export PGPASSWORD=password
# psql -h 192.168.1.** -U postgres dbname -c 'select now()'
              now
-------------------------------
 2015-10-26 23:40:06.822327+09
(1 row)

ファイルが置きたくない、ホームディレクトリがないユーザで実行したい場合は環境変数に入れる方法がいいかと思います。

PostgreSQLのサイトでは環境変数に入れる方法はセキュリティ上非推奨のようです。

 

結論

  • .pgpass
    • PostgreSQLで推奨されている。
    • ホームディレクトリに置く為使用するユーザに限られる。
    • psqlに接続するユーザ分ファイル設置が必要
  • 環境変数
    • PostgreSQLでは非推奨
    • ホームディレクトリがないユーザでも使用できる。
    • 使用されたくないユーザにもパスワードがばれる

個人的には.pgpassに入れるよりシェルスクリプトにexportを追加する方法が手軽だと思います。

厳しく制限するなら.pgpassで。

 

環境変数は他パラメータでも利用できる

環境変数の設定はパスワードだけではなく、ホスト、ユーザ、DBも設定することができます。

#ホスト名
export PGHOST=192.168.1.**

#ポート
export PGPORT=5432

#DB名
export PGDATABASE=pgdata

#ユーザ
export PGUSER=postgres

#パスワード
export PGPASSWORD=password

#パスワードファイル格納先
export PGPASSFILE=~/.pgpass

実行結果

# export PGHOST=192.168.1.**
# export PGPORT=5432
# export PGDATABASE=pgdata
# export PGUSER=postgres
# export PGPASSWORD=password
# psql -c 'select now()'
             now
------------------------------
 2015-10-27 00:08:09.19277+09
(1 row)

psqlの引数が少なくなるので複数のSQL実行する際には便利です。

 

参考

 - PostgreSQL, SQL , , , , ,