我有一个在服务器上转储数据库的结构脚本。我可以在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=''
)。我希望这个代码可以使用或不使用密码。
答案 0 :(得分: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将失败。
我会为系统用户postgres
启用无密码访问到配置文件pg_hba.conf
中的每个数据库。使用peer
或ident
authentication methods。然后您不必提供密码,脚本将始终有效:
local all postgres ident
您的脚本将简化为(未经测试):
sudo("su postgres -c \"pg_dump %s > /tmp/telemedia_newdb\"" % (HOST_SOURCE_DB))