どうしたらpsqlを呼び出してパスワードの入力を求めないようにすることができますか?
これは私が持っているものです:
psql -Umyuser < myscript.sql
しかし、パスワードを渡す引数が見つからなかったため、psqlは常にパスワードを要求します。
PostgreSQLへの認証方法はいくつかあります。あなたは https://www.postgresql.org/docs/current/static/client-authentication.html でパスワード認証に代わるものを調査したいと思うかもしれません。
あなたの質問に答えるために、パスワードベースの認証のためにパスワードを提供するいくつかの方法があります。明らかな方法はパスワードプロンプトによるものです。その代わりに、pgpassファイルまたはPGPASSWORD
環境変数を通してパスワードを提供できます。これらを参照してください。
その情報はすべてのユーザーに利用可能であり、したがって安全ではないため、コマンドライン引数としてパスワードを提供するオプションはありません。ただし、Linux/Unix環境では、次のように単一のコマンドに環境変数を指定できます。
PGPASSWORD=yourpass psql ...
PGPASSWORD=[your password] psql -Umyuser < myscript.sql
スクリプトの最初にこのコマンドラインを追加することができます。
set PGPASSWORD=[your password]
複数のホスト/データベース接続をするつもりなら、 〜/ .pgpassファイル を使うのがいいでしょう。
ステップ:
vim ~/.pgpass
などを使用してファイルを作成します。次の形式で情報を入力します。hostname:port:database:username:password
フィールド値の前後に文字列の引用符を付けないでください。 *あなたのport/databaseフィールドのワイルドカードとして*を使うこともできます。chmod 0600 ~/.pgpass
を使わなければなりません。alias postygresy='psql --Host hostname database_name -U username'
値は、〜/ .pgpassファイルに入力したものと一致する必要があります。. ~/.bashrc
または同様のもので入手してください。エクスポートPGPASSWORD = ''変数セットがある場合は、ファイルよりも優先されます。
パスワードファイルを作成する必要があります。詳細については、 http://www.postgresql.org/docs/9.0/interactive/libpq-pgpass.html を参照してください。情報.
私のようなWindowsで問題を抱えている場合(私はWindows 7 64ビットを使用しています)、set PGPASSWORD=[Password]
が機能しませんでした。
それから、Kavakliogluがコメントの1つで言ったように、
export PGPASSWORD=[password]
これはファイルの先頭、または使用前に保存してから呼び出し前に設定する必要があります。
確かにWindows上で動作します:)
PGPASSWORD環境変数を使用することに関するセキュリティ上の問題を考えると、私は最良の全体的な解決策は以下のようになると思います。
ここで注意すべき点がいくつかあります。ステップ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
それはPGPASSWORDを使用して簡単に実行できます。私はpsql 9.5.10を使用しています。あなたの場合は解決策は
PGPASSWORD=password psql -U myuser < myscript.sql
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行目では、-h
myserver、-p
myport、または-U
/を使用する必要はありません。jdoeデフォルトを使用する場合はフラグ(localhost:5432)データベースユーザーは1人のみです。複数のユーザーの場合(ただしデフォルトの接続)、その行を
psql mydb jdoe
スクリプトを忘れずにexecutableにしてください
chmod +x runpsql
(またはスクリプトファイルと呼ばれるもの)
UPDATE:
RichVelのアドバイスを受けて、ファイルを読めないようにしましたbeforeパスワードを入力しました。これにより、わずかなセキュリティホールが閉じられます。ありがとう!
8年後...
私のMacでは、ファイルに~/.pgpass
のような行を追加する必要がありました。
<IP>:<PORT>:<dbname>:<user>:<password>
参照:
https://www.postgresql.org/docs/current/libpq-pgpass.html
https://wiki.postgresql.org/wiki/Pgpass