どのようにして呼び出すことができますpsqlをそれはようにパスワードの入力を要求しませんか?
これは私が持っているものです:
psql -Umyuser < myscript.sql
しかし、パスワードを渡す引数が見つからなかったため、psqlは常にそれを要求します。
どのようにして呼び出すことができます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]
export PGPASSWORD=[password]
が機能しました
#!/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
PGPASSWORD=password
。
複数のホスト/データベース接続を使用する場合は、〜/ .pgpassファイルが適しています。
手順:
vim ~/.pgpass
または同様のものを使用してファイルを作成します。次の形式で情報を入力します
hostname:port:database:username:password
。フィールド値の前後に文字列の引用符を追加しないでください。*をポート/データベースフィールドのワイルドカードとして使用することもできます。chmod 0600 ~/.pgpass
psqlによって黙って無視されないようにする必要があります。alias postygresy='psql --host hostname database_name -U username'
値は〜/ .pgpassファイルに入力した値と一致する必要があります。. ~/.bashrc
または同様のbashプロファイルを入手します。エクスポートPGPASSWORD = ''変数が設定されている場合、ファイルよりも優先されることに注意してください。
chmod 600
ファイルでa を実行する必要があります。そうしないpsql
と、黙って無視されます(ドキュメントによると)。
これは古い質問かもしれませんが、誰も言及していない、使用できる別の方法があります。接続URIで直接パスワードを指定することが可能です。ドキュメントはこちら、またはこちらにあります。
に提供されている接続URIにユーザー名とパスワードを直接入力できますpsql
。
# postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
psql postgresql://username:password@localhost:5432/mydb
PGPASSWORD
私のようなウィンドウ(Windows 7 64ビットを使用しています)で問題が発生し、動作しset PGPASSWORD=[Password]
なかった場合。
次に、カバクリオグルがコメントの1つで言ったように、
export PGPASSWORD=[password]
これをファイルの先頭に保存するか、使用前に保存して、呼び出される前に設定する必要があります。
確かにWindowsで動作します:)
export PGPASSWORD=[password]
コマンドライン(cmd.exe)を使用してもまったく機能しません。cygwinなどを使用していないのですか?
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
* 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番号をファイル名に追加するので、このスクリプトは、副作用なしに複数回、同時にでも実行できます。
chmod
4行目でコマンドを使用していることに注意してください。マイティバイトで説明されている「not a plain file」エラーと同様に、これを行わないと「permissions」エラーが発生します。
7行目では、デフォルト(localhost:5432)を使用し、データベースユーザーが1人だけの場合、-h
myserver、-p
myport、または-U
jdoeフラグを使用する必要はありません。複数のユーザーの場合(ただし、デフォルトの接続)、その行を
psql mydb jdoe
スクリプトを作ることを忘れないでください、実行して
chmod +x runpsql
(またはスクリプトファイルと呼んだもの)
更新:
私が取ったRichVelのアドバイスをして読めないファイル作ら前に、それにパスワードを入れます。これにより、わずかなセキュリティホールが塞がれます。ありがとう!
mktemp
独自の命名方式を考え出す代わりに、を使用して一時ファイルを作成できます。新しい一時ファイル(/tmp/tmp.ITXUNYgiNh
Linuxや/var/folders/xx/7gws2yy91vn9_t2lb8jcr2gr0000gn/T/tmp.QmbVOQk4
MacOS Xのような名前)を作成し、その名前をstdoutに出力します。
chmod 600
ファイルを作成した後、パスワードを書き込む前に行うことをお勧めします。書かれているように、サーバー上の悪意のあるスクリプトがこの形式のファイルを継続的に読み取ろうとする可能性があり、場合によってはパスワードの取得に成功します。また、このスクリプトが何らかの理由で中断された場合、ファイルはディスク上に残されます-シェルtrap
ハンドラーを作成すると、これに対処します。このような安全なスクリプトを書くことは簡単ではないので、export PGPASSWORD
代わりに使用することをお勧めします。
PGPASSWORD
9.3で廃止されたため、この種のソリューションが必要です。
8年後...
私のMacでは、次の~/.pgpass
ような行をファイルに追加する必要
がありました。
<IP>:<PORT>:<dbname>:<user>:<password>
こちらもご覧ください:
https : //www.postgresql.org/docs/current/libpq-pgpass.html
https://wiki.postgresql.org/wiki/Pgpass