29

psqlバッチスクリプトを使用してこのコマンドを実行しようとしています:

psql --host=localhost --dbname=<dbname> --port=<Port Number>
     --username=<dbuser> --file=C:\PSQL_Script.txt --output=C:\PSQL_Output.txt

問題は、バッチ スクリプトを実行するたびにパスワードを要求されることです。バッチファイルを介して引数にパスワードを設定するにはどうすればよいですか?

4

4 に答える 4

58

読み続けてください。最良のオプションは最後に来ます。しかし、最初にいくつかのことを明確にしましょう。

パスワード要求のみを沈黙させる

問題がパスワード プロンプトのみの場合は、サイレントにすることができます。ここでマニュアルを引用します:

-w
--no-password

パスワード プロンプトを発行しないでください。サーバーがパスワード認証を要求し、.pgpassファイルなどの他の手段でパスワードを使用できない場合、接続試行は失敗します。このオプションは、パスワードを入力するユーザーが存在しないバッチ ジョブやスクリプトで役立ちます。(...)

おそらくパスワードは必要ありません

通常、これは不要です。通常、デフォルトのデータベース スーパーpostgresユーザーは、同じ名前のシステム ユーザーに対応します。認証方法またはがファイルに設定されている場合、このアカウントからの実行psqlにパスワードは必要ありません。おそらく次のような行があります。peeridentpg_hba.conf

local    all    postgres    peer

また、通常は次のことも行います。

local    all    all         peer

これは、すべてのローカルユーザーがパスワードなしで同じ名前のデータベース ユーザーとしてすべてのデータベースにログインできることを意味します。
ただし、ここにはよくある誤解があります。再び引用

このメソッドは、ローカル接続でのみサポートされています。

大胆強調鉱山。「ローカル」という単語が含まれていても、「ローカル接続」ではない に
接続しています。127.0.0.1 への TCP/IP 接続です。ローカルホストのウィキペディア:localhost

最新のコンピューター システムでは、ホスト名が(ループバック) ネット ブロック (通常は、またはIPv6 )localhostの IPv4 アドレスに変換されるためです。127.0.0.0/8127.0.0.1::1

ローカル接続のためのシンプルなソリューション

呼び出し-hからパラメーターを省略します。もう一度マニュアルをpsql引用します:psql

ホスト名を省略すると、psql は Unix ドメイン ソケット経由でローカル ホスト上のサーバーに接続する 、TCP/IP 経由でlocalhostUnix ドメイン ソケットを持たないマシンに接続します。

ウィンドウズ

... には Unix ドメイン ソケットがありません。でpg_hba.conf始まる行localは Windows には適用されません。Windows ではlocalhost、デフォルトで経由して接続するため、最初に戻ります。

セキュリティ要件が緩い場合は、次の方法ですべての接続を信頼できますlocalhost

host    all    all    127.0.0.1/32     trust

リモート接続をオフにしてデバッグする場合にのみ、これを行います。セキュリティを強化するために、Windows でSSPI 認証を使用できます。pg_hba.conf「ローカル」接続の場合は、次の行を追加します。

host    all    all    127.0.0.1/32     sspi

実際にパスワードが必要な場合

環境変数を設定することもできますが、特に Windows では推奨されません。マニュアル:

PGPASSWORDpassword接続パラメーターと同じように動作します。一部のオペレーティング システムでは、root 以外のユーザーが ps を介してプロセス環境変数を参照できるため、この環境変数の使用はセキュリティ上の理由からお勧めしません。代わりに、~/.pgpassファイルの使用を検討してください (セクション 32.15を参照)。

のマニュアルpsql:

接続パラメーターを指定するconninfo代わりに文字列を使用できます。

 $ psql "user=myuser password=secret_pw host=localhost port=5432 sslmode=require"

または、データベース名の代わりに使用されるURI :

 $ psql postgresql://myuser:secret_pw@localhost:5432/mydb?sslmode=require

パスワードファイル

ただし、通常は、パスワードをスクリプト ファイルに入れるよりも、.pgpassファイルを設定する方が望ましいです。マニュアルの短い章を注意深く
読んでください。特に、ここに注意してください...

のホスト名は、ローカル マシンからのlocalhostTCP (ホスト名localhost) および Unix ドメイン ソケット (空または既定のソケット ディレクトリ) 接続の両方に一致します。pghost

正確なパスはシステムによって異なります。このファイルは、ロールとポート (DB クラスター) の複数の組み合わせのパスワードを保存できます。

localhost:5432:*:myadmin:myadminPasswd
localhost:5434:*:myadmin:myadminPasswd
localhost:5437:*:myadmin:myadminPasswd
...

Windowsマシンでは、次のファイルを探します

%APPDATA%\postgresql\pgpass.conf

%APPDATA%通常、次のように解決されますC:\Documents and Settings\My_Windows_User_Name\Application Data\

于 2013-03-23T23:01:13.607 に答える
1

私はちょっと同じ問題を抱えていました:

psql -hlocalhost -d<myDB> -U<myUser>

常にパスワードの入力を求められました。これは-hlocalhost、Unixドメインソケット(UnixベースのOSの場合)ではなくTCPを介して接続しているため、@Erwinが説明したとおりです。localしたがって、信頼できるものとして構成した場合でも:

local   all    all                     trust

それでもパスワードの入力を求められます。したがって、-hlocalhostTCP 経由で動作するように を構成するには、次hostのように localhost アドレスを構成する必要がありました。

host    all    all    127.0.0.1/32     trust
host    all    all    ::1/128          trust

しかし、これは私にはうまくいきませんでした。私がしなければならなかったのは、これらの両方を次のように組み合わせることです。

host    all    all    localhost        trust

いくつかの追加の読み物:

于 2015-11-19T10:12:22.463 に答える