「psql」のパスワードを非対話的に指定するにはどうすればよいですか?


337

シェルスクリプトを使用してデータベース作成プロセスを自動化しようとしていますが、psqlにパスワードを渡すことで障害が1つありました。シェルスクリプトのコードの一部を次に示します。

psql -U $DB_USER -h localhost -c"$DB_RECREATE_SQL"

psql非対話的な方法でパスワードを渡すにはどうすればよいですか?


1
接続URLを使用できます。stackoverflow.com/questions/3582552/postgres-connection-urlでこの回答を確認してください。
paulodiovani

回答:


141

公式ドキュメントから:

定期的にパスワードを入力する必要がないようにするために〜/ .pgpassファイルがあると便利です。詳細は項30.13を参照してください。

...

このファイルには、次の形式の行が含まれている必要があります。

hostname:port:database:username:password

現在の接続パラメータと一致する最初の行のパスワードフィールドが使用されます。


29
おかげで、私はpgpassを知っていますが、これは問題を解決しません-データベースを操作するために自己完結型のbashスクリプトが必要なので、コマンドラインを介して情報をpsqlに渡すことについての私の質問。
アレックスN.

6
私の唯一の選択肢は、bashスクリプトがアクセスできる.pgpassファイルを設定することだと思います。または、パスワードをまったく使用しないでください。identなどの別の形式の認証を設定したり、SSL証明書を使用したりできます。
Flimzy '19年

それは私が恐れていたものです:)情報をありがとう!
アレックスN.

別のオプションは、expectを使用することです。しかし、私は期待が本当に嫌いです:)
Flimzy

1
.pgpassファイルを読み取り、書き込み、実行するためのグループおよびその他のユーザー権限を削除することを忘れないでください!実行chmod go-rwx .pgpass
Vladislavs Dovgalecs

610

psqlを呼び出す前に、スクリプト内にPGPASSWORD環境変数を設定します

PGPASSWORD=pass1234 psql -U MyUsername myDatabaseName

参考として、http://www.postgresql.org/docs/current/static/libpq-envars.htmlを参照してください。


編集する

Postgres 9.2以降、ユーザー名パスワードを含むことができる接続文字列またはURIを指定するオプションもあります。

ps他のユーザーが(Linux)、ProcessExplorer(Windows)などのツールを使用して実行中のプロセスのコマンドラインを見ると、パスワードがプレーンテキストで表示されるため、これを使用するとセキュリティリスクになります。

データベース管理者に関するこの質問も参照してください


32
たとえば、1行で次のようなことができます:PGPASSWORD = pass1234 psql -u MyUsername myUserName
andyortlieb

3
これは、SQLスクリプトを実行するための最も便利な方法だと思います。
zr870

2
追加できるのspaceは、コマンドラインで最初の文字の前にa を追加するだけです。コマンドはbash履歴に保存されません。ubuntu / bashで動作します。
Baldr 2016年

5
ボーナス:Dockerで機能:docker run -e PGPASSWORD="$(pbpaste)" --rm postgres psql -h www.example.com dbname username -c 'SELECT * FROM table;'
Bilal Akil 2017年

3
注意して、必ず前にスペースを追加してください。そうしないと、bash履歴に表示されます〜/ .bash_historyファイル...
rogerdpack

102
  • 一行で:

    export PGPASSWORD='password'; psql -h 'server name' -U 'user name' -d 'base name' -c 'command'

    コマンド SQLコマンドなど"select * from schema.table"

  • またはもっと読みやすい:

    export PGPASSWORD='password'
    psql -h 'server name' -U 'user name' -d 'base name' \
         -c 'command' (eg. "select * from schema.table")

18
1行を少し簡略化すると PGPASSWORD='password' psql .... 、次のようになります。これには、コマンドの実行後に変数にアクセスできないという利点もあります。
Garrett

3
export PGPASSWORD=YourNewPassword他のバリエーションよりも私のために働いた。
Mikeumus 16

7
export PGPASSWORD本当に悪い考えのように聞こえる
hasen '28

1
これにより、パスワードがbash履歴の〜/ .bash_historyファイルに保存され(前のスペースを常に慎重に追加しない限り)、パスワードが現在の環境にエクスポートされますFWIW:|
rogerdpack 2017

67

私はURLをpsqlに渡すことを好む傾向があります:

psql "postgresql://$DB_USER:$DB_PWD@$DB_SERVER/$DB_NAME"

これにより、環境変数に自由に名前を付けることができ、不要なファイルの作成を回避できます。

これにはが必要libpqです。ドキュメントはここにあります


pg_restoreでこのようなものを使用できますか?ありがとう!
the_ccalderon

1
@ ccalderon911217どうやらできる:stackoverflow.com/a/28359470/1388292
Jacques Gaudin

@JacquesGaudinうん、自分でテストしました!ありがとうございました!
the_ccalderon

26

Windowsの場合:

  1. PGPASSWORDに値を割り当てます。 C:\>set PGPASSWORD=pass

  2. コマンドを実行: C:\>psql -d database -U user

準備ができて

または一行で

set PGPASSWORD=pass&& psql -d database -U user

&&!の前にスペースがないことに注意してください。


1
私はそれを試しました、そしてそれはうまくいきませんでした。まだパスワードの入力を求められています。
アンチパターン'19年

1
@antipatternオプション-wも渡す必要があります。
mljrg

1
PGPASSWORD=xxxx psql -U username -d database -w -c "select * from foo;"動作します。
スティーブシップウェイ

21

これ.pgpassは、(Linux)ユーザーのホームディレクトリにファイルを作成することで実行できます。 .pgpass ファイル形式:

<databaseip>:<port>:<databasename>:<dbusername>:<password>

*詳細の代わりにワイルドカードを使用することもできます。

tmp.sqlパスワードを要求せずに実行したいとします。

次のコードを使用すると、*。shファイルでできます

echo "192.168.1.1:*:*:postgres:postgrespwd" > $HOME/.pgpass
echo "` chmod 0600 $HOME/.pgpass `"

echo " ` psql -h 192.168.1.1 -p 5432  -U postgres  postgres  -f tmp.sql `        

11
エコーのポイントは何ですか "` chmod 0600 $ HOME / .pgpass `"?chmod 0600 $ HOME / .pgpassはどうですか?
Vlad Patryshev 14年

12

PGPASSWORD環境変数を使用する代わりにconninfoドキュメントに従って文字列を使用することもできます

接続パラメータを指定する別の方法は、データベース名の代わりに使用されるconninfo文字列またはURIです。このメカニズムにより、接続を非常に幅広く制御できます。

$ psql "host=<server> port=5432 dbname=<db> user=<user> password=<password>"

postgres=>

ありがとう、それは私にとってはうまく
いき

4

pg_env.shの内容を.bashrcに追加しました:

cat /opt/PostgreSQL/10/pg_env.sh

#!/bin/sh
# The script sets environment variables helpful for PostgreSQL

export PATH=/opt/PostgreSQL/10/bin:$PATH
export PGDATA=/opt/PostgreSQL/10/data
export PGDATABASE=postgres
export PGUSER=postgres
export PGPORT=5433
export PGLOCALEDIR=/opt/PostgreSQL/10/share/locale
export MANPATH=$MANPATH:/opt/PostgreSQL/10/share/man

追加(ユーザーごとの提案4653174)

export PGPASSWORD='password'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.