web-dev-qa-db-ja.com

Postgresql:パスワードを使ったpsql実行のスクリプト

どうしたらpsqlを呼び出してパスワードの入力を求めないようにすることができますか

これは私が持っているものです:

psql -Umyuser < myscript.sql

しかし、パスワードを渡す引数が見つからなかったため、psqlは常にパスワードを要求します。

241
Axel Fontaine

PostgreSQLへの認証方法はいくつかあります。あなたは https://www.postgresql.org/docs/current/static/client-authentication.html でパスワード認証に代わるものを調査したいと思うかもしれません。

あなたの質問に答えるために、パスワードベースの認証のためにパスワードを提供するいくつかの方法があります。明らかな方法はパスワードプロンプトによるものです。その代わりに、pgpassファイルまたはPGPASSWORD環境変数を通してパスワードを提供できます。これらを参照してください。

その情報はすべてのユーザーに利用可能であり、したがって安全ではないため、コマンドライン引数としてパスワードを提供するオプションはありません。ただし、Linux/Unix環境では、次のように単一のコマンドに環境変数を指定できます。

PGPASSWORD=yourpass psql ...
275
Reece
PGPASSWORD=[your password] psql -Umyuser < myscript.sql
148
Greg

スクリプトの最初にこのコマンドラインを追加することができます。

set PGPASSWORD=[your password]
63
jbaylina

複数のホスト/データベース接続をするつもりなら、 〜/ .pgpassファイル を使うのがいいでしょう。

ステップ:

  1. vim ~/.pgpassなどを使用してファイルを作成します。次の形式で情報を入力します。hostname:port:database:username:passwordフィールド値の前後に文字列の引用符を付けないでください。 *あなたのport/databaseフィールドのワイルドカードとして*を使うこともできます。
  2. Psqlで黙って無視されないようにするためにはchmod 0600 ~/.pgpassを使わなければなりません。
  3. あなたのbashプロファイルにあなたのpsqlコマンドを実行するエイリアスを作成してください。例:alias postygresy='psql --Host hostname database_name -U username'値は、〜/ .pgpassファイルに入力したものと一致する必要があります。
  4. あなたのbashプロファイルを. ~/.bashrcまたは同様のもので入手してください。
  5. コマンドラインからエイリアスを入力します。

エクスポートPGPASSWORD = ''変数セットがある場合は、ファイルよりも優先されます。

46
tandy

これは古い質問かもしれませんが、誰も言及していないという代替方法があります。接続URIで直接パスワードを指定することは可能です。ドキュメントはこちら 、こちら 、あるいは こちら です。

psqlに提供された接続URIであなたのユーザー名とパスワードを直接提供することができます。

# postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
psql postgresql://username:password@localhost:5432/mydb
18
ajxs

パスワードファイルを作成する必要があります。詳細については、 http://www.postgresql.org/docs/9.0/interactive/libpq-pgpass.html を参照してください。情報.

12
Femi

私のようなWindowsで問題を抱えている場合(私はWindows 7 64ビットを使用しています)、set PGPASSWORD=[Password]が機能しませんでした。

それから、Kavakliogluがコメントの1つで言ったように、

export PGPASSWORD=[password]

これはファイルの先頭、または使用前に保存してから呼び出し前に設定する必要があります。

確かにWindows上で動作します:)

12
Jamie Hutber

PGPASSWORD環境変数を使用することに関するセキュリティ上の問題を考えると、私は最良の全体的な解決策は以下のようになると思います。

  1. あなたが使用したいパスワードであなた自身の一時的なpgpassファイルを書きなさい。
  2. PGPASSFILE環境変数を使用して、psqlにそのファイルを使用するように指示します。
  3. 一時pgpassファイルを削除します

ここで注意すべき点がいくつかあります。ステップ1は、存在する可能性があるユーザーの〜/ .pgpassファイルによる誤解を避けるためのものです。また、ファイルに0600以下の権限があることを確認する必要があります。

次のようにbashを利用してこれを短縮することを提案する人もいます。

PGPASSFILE=<(echo myserver:5432:mydb:jdoe:password) psql -h myserver -U jdoe -p 5432 mydb

これは、実際のファイルにデータを書き込む必要を回避するために<()構文を使用します。しかし、psqlは使用されているファイルをチェックして次のようなエラーを投げるのでうまくいきません。

WARNING: password file "/dev/fd/63" is not a plain file
6
mightybyte

それはPGPASSWORDを使用して簡単に実行できます。私はpsql 9.5.10を使用しています。あなたの場合は解決策は

PGPASSWORD=password psql -U myuser < myscript.sql

6
pyAddict

mightybyte's answer に基づいて、* nixシェルスクリプトに慣れていない人のために、ここに作業スクリプトを示します。

#!/bin/sh
PGPASSFILE=/tmp/pgpasswd$$
touch $PGPASSFILE
chmod 600 $PGPASSFILE
echo "myserver:5432:mydb:jdoe:password" > $PGPASSFILE
export PGPASSFILE
psql mydb
rm $PGPASSFILE

$$の2行目の二重ドル記号(/tmp/pgpasswd$$)は、プロセスID番号をファイル名に追加します。これにより、このスクリプトを副作用なく複数回、同時に実行することができます。

行4でのchmodコマンドの使用に注意してください-"not a plain file"エラーmightybyte 説明、これが行われていない場合、「permissions」エラーもあります。

7行目では、-hmyserver-pmyport、または-U /を使用する必要はありません。jdoeデフォルトを使用する場合はフラグ(localhost5432)データベースユーザーは1人のみです。複数のユーザーの場合(ただしデフォルトの接続)、その行を

psql mydb jdoe

スクリプトを忘れずにexecutableにしてください

chmod +x runpsqlまたはスクリプトファイルと呼ばれるもの

UPDATE:

RichVelのアドバイスを受けて、ファイルを読めないようにしましたbeforeパスワードを入力しました。これにより、わずかなセキュリティホールが閉じられます。ありがとう!

5
2

8年後...

私のMacでは、ファイルに~/.pgpassのような行を追加する必要がありました。

<IP>:<PORT>:<dbname>:<user>:<password>

参照:
https://www.postgresql.org/docs/current/libpq-pgpass.html
https://wiki.postgresql.org/wiki/Pgpass

0
Dirk Schumacher