带有 -w 标志的 pg_dump 无法从 .pgpass 文件读取

带有 -w 标志的 pg_dump 无法从 .pgpass 文件读取

我正在尝试使用包含以下命令的脚本备份 Ubuntu 18.04 LTS 上名为 crewdb 的 PostgreSQL 数据库:

pg_dump -h localhost -p 5432 -U postgres -w -C -F p -b -v -f ~/Dropbox\/postgres_backup/crewdb.backup.sql crewdb

我知道上述命令运行的脚本本身是有效的。当我使用 -W 而不是 -w 运行上述命令时,系统会提示我输入密码,备份会顺利进行。我试图在脚本中自动执行此命令,并希望备份继续进行而无需提示输入密码,因此使用 -w 标志。为此,我创建了以下文件

/home/chh1/.pgpass

什么时候ls -la ~/.pgpass

-rw------- 1 chh1 chh1 74 Oct 15 10:00 .pgpass

在 .pgpass 文件中我放置了以下文本:

# Server:Port:Database:Username:Password

*:*:crewdb:postgres:9Gh#$mq

但是,当我运行命令时,出现以下错误输出,并且备份失败:

pg_dump -h localhost -p 5432 -U postgres -w -C -F p -b -v -f ~/Dropbox\/postgres_backup/crewdb.backup.sql crewdb

pg_dump: [archiver (db)] connection to database "crewdb" failed: FATAL:
password authentication failed for user "postgres" password retrieved from
file "/home/chh1/.pgpass" FATAL:  password authentication failed for user
"postgres" password retrieved from file "/home/chh1/.pgpass"

我基本上遵循了以下流程:

1)创建.pgpass文件,内容如下

  *:*:crewdb:postgres:9Gh#$mq

2)使用命令设置权限

 sudo chmod 600 .pgpass

3)将文件所有者设置为您登录时使用的同一用户:

sudo chown chh1:chh1 .pgpass

4)设置PGPASSFILE环境变量:

 export PGPASSFILE='/home/chh1/.pgpass'

现在检查

psql -h localhost -U postgres crewdb

我收到类似的错误:

psql: FATAL:  password authentication failed for user "postgres"
password retrieved from file "/home/chh1/.pgpass"
FATAL:  password authentication failed for user "postgres"
password retrieved from file "/home/chh1/.pgpass"

以下是我的 pg_hba.conf 文件中的设置:

# Database administrative login by Unix domain socket
local   all             postgres                                md5

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            md5
host    replication     all             ::1/128                 md5

如果这里有人能给我指明正确的道路我将非常感激!

答案1

十六进制转储表明,在密码之后和行末之前.pgpass有一个空格字符( ):20

47 68 23 24 6d 71 20 0a |Gh#$mq .

必须删除该空格,否则它将被视为密码的一部分。

相关内容