Postgresql:パスワードを使用したPSQL実行のスクリプト


274

どのようにして呼び出すことができますpsqlをそれはようにパスワードの入力を要求しませんか

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

psql -Umyuser < myscript.sql

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


4
結局、PGPASSWORD環境変数を使用しました。これは私のユースケースに完全に適合しました。スクリプト内でシンプルかつ自己完結型。
Axel Fontaine


回答:


315

PostgreSQLへの認証にはいくつかの方法があります。https://www.postgresql.org/docs/current/static/client-authentication.htmlでパスワード認証の代替手段を調査することをお勧めします

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

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

PGPASSWORD=yourpass psql ...

11
PGPASSWORDは非推奨ですが、まだ機能します。Just FYI
スコットマーロウ

35
うん、それは非推奨です(そのため、リンクの1つに記載されています)。それが出てきたので、それが多くの人々にとって非常に有用であり、深刻なセキュリティの懸念なしにいくつかの状況で使用できるので、非難が激しく論争されていることにも注目する価値があるでしょう。たとえば、NFSファイルシステムに.pgpassを保存するよりも悪いことではないようです。PGPASSWORDを日常的に使用しています。
Reece

1
コマンドライン情報が「すべてのユーザーに利用可能」であるという考えは、マルチユーザーシステムに関する時代遅れの仮定に基づいており、システムが単一のアプリケーションを実行するだけですべて自動化されている最新の環境には当てはまりません
Alex R

159
PGPASSWORD=[your password] psql -Umyuser < myscript.sql

1
これはテラフォームでも機能します。あなた、私の友人は命の恩人です
wildthing81

67

スクリプトの先頭に次のコマンドラインを追加できます。

set PGPASSWORD=[your password]

24
私の場合、setコマンドは機能しませんでしたexport PGPASSWORD=[password]が機能しました
CanKavaklıoğlu2013年

シェルスクリプトでは機能しません。私はそれを使用しています #!/bin/sh set PGPASSWORD = postgres psql -h 192.168.3.200 -U postgres incx_um << EOF DELETE FROM usrmgt.user_one_time_codes WHERE time < NOW() - INTERVAL '30 minute' EOF
Govind Gupta

2
スペースを使用しないようにしてください。PGPASSWORD=password
Ariejan

48

複数のホスト/データベース接続を使用する場合は、〜/ .pgpassファイル適しています

手順:

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

エクスポートPGPASSWORD = ''変数が設定されている場合、ファイルよりも優先されることに注意してください。


1
chmod 600ファイルでa を実行する必要があります。そうしないpsqlと、黙って無視されます(ドキュメントによると)。
RichVel

33

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

に提供されている接続URIにユーザー名とパスワードを直接入力できますpsql

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

2
Postrgres 9.3は環境変数を無視しますPGPASSWORD
david.perez

14

私のようなウィンドウ(Windows 7 64ビットを使用しています)で問題が発生し、動作しset PGPASSWORD=[Password]なかった場合。

次に、カバクリオグルがコメントの1つで言ったように、

export PGPASSWORD=[password]

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

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


1
export PGPASSWORD=[password]コマンドライン(cmd.exe)を使用してもまったく機能しません。cygwinなどを使用していないのですか?
Devin Snyder

clでのみ機能します。ファイルに追加しましたか?今、それをコマンドに入力しただけですか?
Jamie Hutber、2014年

Linux / Mac環境で使用しても問題ありません。Windowsの場合、この環境変数をエクスポートする方法を見つける必要があります。
Pengfei.X 2015年

グローバルパスワードを追加してください...それも興味深いアイデアです
Jamie Hutber

12

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


7

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

このアプローチの実際の例は、stackoverflow.com / a / 40614592/3696363にあります。この質問に対する別の回答です。
Eliyahu Skoczylas 2017

このユーザーは私が探しているものと同じものを実際に求めていませんでしたが、アプローチは一致していません。PGPASSFILE = <(whatever)構文を使用すると、ファイルの暗号化解除などを実行して、作成されたファイル記述子にのみ存在させることができます。一時ファイルを作成しても、ディスクに資格情報を持つファイルがあるという問題を根本的に解決することにはなりません。そのような恣意的な業界ルールを扱うのは楽しいことではありませんが、多くの人が対処することです。
Desidero

7

PGPASSWORDを使用するだけで実行できます。私はpsql 9.5.10を使用しています。あなたの場合、解決策は

PGPASSWORD=password psql -U myuser < myscript.sql


5

* 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行目の2 つのドル記号($$/tmp/pgpasswd$$は、プロセスID番号をファイル名に追加するので、このスクリプトは、副作用なしに複数回、同時にでも実行できます。

chmod4行目でコマンドを使用していることに注意してください。マイティバイトで説明されている「not a plain file」エラーと同様に、これを行わないと「permissions」エラーが発生します。

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

psql mydb jdoe

スクリプトを作ることを忘れないでください、実行して

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

更新:

私が取ったRichVelのアドバイスをして読めないファイル作ら前に、それにパスワードを入れます。これにより、わずかなセキュリティホールが塞がれます。ありがとう!


4
mktemp独自の命名方式を考え出す代わりに、を使用して一時ファイルを作成できます。新しい一時ファイル(/tmp/tmp.ITXUNYgiNhLinuxや/var/folders/xx/7gws2yy91vn9_t2lb8jcr2gr0000gn/T/tmp.QmbVOQk4MacOS Xのような名前)を作成し、その名前をstdoutに出力します。
Ivan Kolmychek 2017年

1
セキュリティの問題chmod 600ファイルを作成した後、パスワードを書き込む前に行うことをお勧めします。書かれているように、サーバー上の悪意のあるスクリプトがこの形式のファイルを継続的に読み取ろうとする可能性があり、場合によってはパスワードの取得に成功します。また、このスクリプトが何らかの理由で中断された場合、ファイルはディスク上に残されます-シェルtrapハンドラーを作成すると、これに対処します。このような安全なスクリプトを書くことは簡単ではないので、export PGPASSWORD代わりに使用することをお勧めします。
RichVel

@RichVelがその小さなセキュリティホールを指摘してくれてありがとう。タッチ作成し、それが明確に改善され、パスワードを入れる前に、ファイルのプライベートを作ります。PGPASSWORD9.3で廃止されたため、この種のソリューションが必要です。
Eliyahu Skoczylas

一部のドキュメントは非推奨であると述べていますが、このQ&Aのコメントで述べられているように、非推奨は異議があり、Postgres 10.6
RichVel

5

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

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

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

postgres=>


1

8年後...

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

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

こちらもご覧ください:
https : //www.postgresql.org/docs/current/libpq-pgpass.html
https://wiki.postgresql.org/wiki/Pgpass


.pgpassを使用する場合は、psqlに-Wを使用しないでください。このパラメーターは、.pgpassの使用をキャンセルします。
avvensis

-1

PGPASSWORD変数を定義していても、psqlはパスワードプロンプトを表示しますが、psqlの-wオプションを指定してパスワードプロンプトを省略することができます。


-6

コマンドで-wを使用します:psql -h localhost -p 5432 -U user -w

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