[pgsql-jp: 27569] pg_ctl と OS起動時のpassword要求について
Yoshihiro Hanahara
hanahara @ meiko.co.jp
2002年 10月 7日 (月) 20:59:42 JST
花原@明宏です。
FreeBSD4.5でPostgreSQL 7.2.1を動かしています。
PostgreSQLはFreeBSDのportsシステムでインストールしました。
PostgreSQLの data/pg_hba.conf ファイルのデフォルトは、
local all trust
host all 127.0.0.1 255.255.255.255 trust
となっていますが、このままですと、そこのマシン上で動くプログラム&PHPスク
リプトなどは、任意のユーザーでPostgreSQLにアクセスできてしまいます。
あまり宜しくないので、これを
local all crypt
host all 127.0.0.1 255.255.255.255 crypt
と変えたところ、リブート時の起動スクリプト(/usr/local/etc/rc.d/010.pgsql.sh)
が実行されるところで、「Password:」とパスワードを求められ、起動処理がブ
ロックされてしまうようなりました。
これは、010.pgsql.sh の中の次の部分
su -l pgsql -c \
'[ -d ${PGDATA} ] && exec /usr/local/bin/pg_ctl start -s -w -l /var/log/pgsql'
のpg_ctlの「-w」オプションがついているのが原因です。
pg_ctlに「-w」をつけると、起動時に 「psql -l」というコマンドが正常に実行
できるまで、ループするというようになっています(/usr/local/sbin/pg_ctl ス
クリプトの末尾の部分)。
pg_ctlに「-w」オプションをつけなければ、「psql -l」を実行しないので、パ
スワードは聞かれません。ただ、PostgreSQLが完全にクライアントからの接続を
受け入れられる状態になっているわけではないので、PostgreSQLのデータベース
に依存するような他のデーモン等があった場合は、あまり良くないなぁ、と思っ
てしまいます。
[pgsql-jp: 25849] にも、この件に関する記述がチラッとあります。
psqlのソースコードも見たのですが、パスワードが必要なとき、
src/bin/psql/common.c のsimple_prompt() という関数の中で、
termin = fopen("/dev/tty", "r");
termout = fopen("/dev/tty", "w");
if (!termin || !termout)
{
if (termin)
fclose(termin);
if (termout)
fclose(termout);
termin = stdin;
termout = stderr;
}
というように、制御端末を再オープンしてます。
したがって起動時のような場合、コンソールが制御端末になっているので、
コンソールからパスワードを読もうとし、ブロックしてしまいます。
何か良い方法はないでしょうか?
---
Yoshihiro Hanahara <hanahara @ meiko.co.jp>
pgsql-jp メーリングリストの案内