シェルスクリプトを使用してデータベース作成プロセスを自動化しようとしていますが、パスワードをpsqlに渡すことで障害が発生しました。以下は、シェル スクリプトのコードの一部です。
psql -U $DB_USER -h localhost -c"$DB_RECREATE_SQL"
psql
非対話的な方法でパスワードを渡すにはどうすればよいですか?
シェルスクリプトを使用してデータベース作成プロセスを自動化しようとしていますが、パスワードをpsqlに渡すことで障害が発生しました。以下は、シェル スクリプトのコードの一部です。
psql -U $DB_USER -h localhost -c"$DB_RECREATE_SQL"
psql
非対話的な方法でパスワードを渡すにはどうすればよいですか?
psql を呼び出す前に、スクリプト内で PGPASSWORD 環境変数を設定します。
PGPASSWORD=pass1234 psql -U MyUsername myDatabaseName
参考までに、http://www.postgresql.org/docs/current/static/libpq-envars.htmlを参照してください。
編集
Postgres 9.2 以降、ユーザー名とパスワードを含む接続文字列または URIを指定するオプションもあります。構文は次のとおりです。
$ psql postgresql://[user[:password]@][host][:port][,...][/dbname][?param1=value1&...]
ps
これを使用すると、他のユーザーが (Linux)、ProcessExplorer (Windows)、または同様のツールを使用して実行中のプロセスのコマンド ラインを見ると、パスワードがプレーン テキストで表示されるため、セキュリティ上のリスクがあります。
データベース管理者に関するこの質問も参照してください
公式ドキュメントから:
~/.pgpass ファイルを用意しておくと、定期的にパスワードを入力する手間を省くことができて便利です。詳細については、セクション 30.13を参照してください。
...
このファイルには、次の形式の行が含まれている必要があります。
hostname:port:database:username:password
現在の接続パラメータに一致する最初の行のパスワード フィールドが使用されます。
.pgpass
これは、(Linux) ユーザーのホーム ディレクトリにファイルを
作成することで実行できます。.pgpass
ファイル形式:
<databaseip>:<port>:<databasename>:<dbusername>:<password>
*
詳細の代わりにワイルドカードを使用することもできます。
tmp.sql
パスワードの入力を求めずに実行したいとします。
次のコードを使用すると、 *.sh ファイルで次のことができます
echo "192.168.1.1:*:*:postgres:postgrespwd" > $HOME/.pgpass
echo "` chmod 0600 $HOME/.pgpass `"
echo " ` psql -h 192.168.1.1 -p 5432 -U postgres postgres -f tmp.sql `
pg_env.sh の内容を .bashrc に追加:
cat /opt/PostgreSQL/10/pg_env.sh
#!/bin/sh
# The script sets environment variables helpful for PostgreSQL
export PATH=/opt/PostgreSQL/10/bin:$PATH
export PGDATA=/opt/PostgreSQL/10/data
export PGDATABASE=postgres
export PGUSER=postgres
export PGPORT=5433
export PGLOCALEDIR=/opt/PostgreSQL/10/share/locale
export MANPATH=$MANPATH:/opt/PostgreSQL/10/share/man
を追加して(user4653174の提案に従って)
export PGPASSWORD='password'