为什么 .pgpass 文件不为 pg_dump、vacuumdb 或 reindexdb 命令提供密码?

Why is .pgpass file not supplying a password for the pg_dump, vacuumdb, or reindexdb commands?

我正在尝试在不同的 bash 脚本中执行多个不同的 PostgreSQL 命令。我以为我已经正确配置了 .pgpass 文件,但是当我尝试 运行 pg_dumpvacuumdbreindexdb 时,我收到关于如何设置密码的错误没有被提供。为了让我的 bash 脚本正确执行,我需要这些命令来 return 退出代码 0.

我在 macOS 10.12.6 (16G1408) 上 运行ning PostgreSQL 9.5.4。

在管理员用户帐户中 [既不是 root 也不是 postgres],我在 ~ 中有一个 .pgpass 文件。 .pgpass 文件包含:

localhost:5432:*:postgres:DaVinci

用户确实是postgres,密码确实是DaVinci

.pgpass 文件的权限为 600

pg_hba.conf 文件中,我有:

# pg_hba.conf file has been edited by DaVinci Project Server. Hence, it is recommended to not edit this file manually.
# TYPE    DATABASE    USER    ADDRESS    METHOD
local    all    all    md5
host    all    all    127.0.0.1/32    md5
host    all    all    ::1/128    md5

因此,例如,从用户帐户 [既不是 root 也不是 postgres],我 运行:

/Library/PostgreSQL/9.5/pgAdmin3.app/Contents/SharedSupport/pg_dump --host localhost --username postgres testworkflow13 --blobs --file /Users/username/Desktop/testdestination1/testworkflow13_$(date "+%Y_%m_%d_%H_%M").backup --format=custom --verbose --no-password

我收到以下错误:

pg_dump: [archiver (db)] connection to database "testworkflow13" failed: fe_sendauth: no password supplied

如果我 运行 和 sudo 也得到相同的结果。

奇怪的是,pg_dump 执行, 导出一个 .backup 文件到 testdestination1 目录,但由于它抛出错误,如果它在 bash 脚本中,脚本将停止。

我哪里错了?如何确保 .pgpass 文件被正确读取,以便命令中的 --no-password 标志起作用?

事实证明,将 pg_hba.conf 文件中的所有三行更改为 trust 身份验证方法解决了这个问题。

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

由于方法是 trust,因此 .pgpass 文件可能完全不相关——我不确定,但至少我可以使用它。

请先阅读 official docs
此外,即使这个主题也超过 2 年,我强烈建议至少更新到版本 10,无论如何相关的内容都没有改变 .pgpass

.pgpass 需要是 chmod 600,好的,使用它的用户必须可以读取,所以它必须是该文件的所有者。

请删除 --no-password 只会混淆并且不需要。

使用 127.0.0.1 而不是 localhost 说明你要去哪里,“通常”是一样的。

... from a user account [neither root nor postgres] ...

如上所述,您使用的用户必须具有对 .pgpass 的读取权限,因此您必须澄清这一点并将该文件提供给该用户,也许使用 PGPASSFILE env 变量可能对您有用。

另一种方法是使用带或不带 .pgpass 的 .pg_service.conf 文件,对于您所写的内容,它看起来可能更合适

您也可以在用户的​​环境中设置 PGPASSWORD。

考虑安全性,有些选择看起来最简单但可能会暴露访问权限。作为 DBA,我坦率地说,我厌倦了将密码存储在可见位置、打印在日志或 github 上或设置“在 pg_hba 中信任”,最后来找我说“postgreSQL 不安全”..哈哈哈!

最后请注意,您没有 pg_hba 错误,以防您收到“pg_hba”错误消息。