2012-01-18 7 views
0

サーバにデータベースをダンプするファブリックスクリプトがあります。 PostgreSQLデータベースを使用して複数のサーバで使用できます。コマンドは単純です:コマンド内のファブリックポストグルパスワード

sudo("su postgres -c \"PGPASSWORD=%s pg_dump %s > /tmp/telemedia_newdb\"" 
% (HOST_SOURCE_DB_UPASS,HOST_SOURCE_DB)) 

しかし、時には、Postgresは

は、このコマンドはPostgresのからプロンプトパスワードを入力せずに失敗します...で、すべてのパスワードを要求しないのですか? (または私はそれがプロンプトされないと、HOST_SOURCE_DB_UPASS='')知っている。このコードは、パスワードの有無にかかわらず動作します。

答えて

1

すべては、pg_hba.confでデータベースへのアクセスを設定する方法によって異なります。データベースクラスタごとに(ポート単位で)個別の設定ファイルがあり、設定はデータベースごとに異なる場合があります。

このように設定した場合、システムユーザーpostgresは一部のデータベースに対してパスワードのないアクセス権を持ちますが、他のユーザーのパスワードを入力するよう求められます。 のデフォルトのは、システムユーザpostgresが、すべてのデータベースに対して同じ名前(postgres)のデータベースユーザとしてパスワードなしでアクセスできることです。

environment variable PGPASSWORDのコマンドでパスワードを入力してもパスワードが必要ない場合は、暗黙的に無視されます。

しかし、私はmanual hereを引用:この環境変数の

PGPASSWORD(...)の使用は、セキュリティ上の理由から推奨されません。

password fileを使用すると、パスワードを自動的に入力できます(Unixシステムでは.pgpass)。 pg_dumpが使用します。

最後に、考慮command line options

--no-password 
--password 

いずれかのプロンプトには、pg_dumpを強制またはパスワードの入力を要求しないように。パスワードが必要だが、--no-passwordによって無効になっている場合、pg_dumpは失敗する。


私は、configファイルpg_hba.conf内のすべてのデータベースへのシステムユーザーpostgresパスワードなしアクセスを可能にします。 peerまたはidentauthentication methodsを使用してください。次に、パスワードを入力する必要はありませんし、スクリプトが常に動作します:

local all   postgres    ident 

あなたのスクリプトが(未テスト)のように簡略化されます:

sudo("su postgres -c \"pg_dump %s > /tmp/telemedia_newdb\"" % (HOST_SOURCE_DB)) 
関連する問題