当 . 主目录中的 pgpass 不是一个选项?

nin*_*ich 2 authentication postgresql pg-dump

我正在运行一个 cron 作业,使用以下命令创建数据库转储pg_dump,如下所示:

export PGPASSWORD="XXXXXXXX"; pg_dump -h localhost -U my_user my_db > /tmp/db_dump.sql
Run Code Online (Sandbox Code Playgroud)

但是当我运行此命令时,出现密码身份验证错误:

pg_dump: [archiver (db)] connection to database "my_db" failed: FATAL:  password authentication failed for user "my_user"
FATAL:  password authentication failed for user "my_user"
Run Code Online (Sandbox Code Playgroud)

我无法将.pgpass文件放置在运行 cron 的用户下,但我可以将其放置在其他位置并指定如下PGPASSFILE

export PGPASSFILE=/path/to/.pgpass; pg_dump -h localhost -U my_user my_db > /tmp/db_dump.sql
Run Code Online (Sandbox Code Playgroud)

但这再次返回相同的身份验证错误。我已经确认这不是密码错误的问题,因为当我使用交互式提示时它有效:

pg_dump --password -h localhost -U my_user my_db > /tmp/db_dump.sql
Password: XXXXXXXX
Run Code Online (Sandbox Code Playgroud)

当我查看文档时,它看起来像是PGPASSWORD环境PGPASSFILE变量中缺少的(也许它们已被删除?)https://www.postgresql.org/docs/10/app-pgdump.html

如果我无法.pgpass在运行脚本的用户的主目录中创建文件,我还能如何运行pg_dump command?

对于上下文,我运行的是pg_dump10.6 版本:

pg_dump --version
pg_dump (PostgreSQL) 10.6 (Ubuntu 10.6-0ubuntu0.18.04.1)
Run Code Online (Sandbox Code Playgroud)

Lau*_*lbe 14

$如果所有、?*"和 都被正确转义,您的原始语句将起作用\

使用单引号而不是双引号是更好的解决方案,正如 a_horse_with_no_name 在评论中建议的那样:

export PGPASSWORD='XXXXXXXX'; pg_dump -h localhost -U my_user my_db > /tmp/db_dump.sql
Run Code Online (Sandbox Code Playgroud)

通常更好的替代方法是使用密码文件

使用密码总是令人讨厌的,因为它必须以明文形式存在。

还有其他选择,例如使用trust身份验证(条目非常有限pg_hba.conf)或证书身份验证。