49

.pgpass在我的主目录中创建了一个文件,看起来像这样

localhost:5432:somedb:someuser:somepass

我正在使用一个 shell 脚本,它创建一个目录并在somedb那里放置一个 pg_dump:

mkdir directory
pg_dump somedb > directory/somefile.dump

它仍然提示输入密码。

这里的错误在哪里?

4

6 回答 6

44

您是否尝试指定主机、用户和数据库?

pg_dump -U someuser -h localhost somedb > directory/somefile.dump
于 2013-05-28T11:58:45.797 回答
33
  1. 创建包含内容的 .pgpass 文件

主机:5432:somedb:someuser:somepass

  1. 设置权限

须藤 chmod 600 .pgpass

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

sudo chown login_username:login_username .pgpass

  1. 设置 PGPASSFILE 环境变量:

导出 PGPASSFILE='/home/user/.pgpass'

现在通过连接到数据库进行检查:

psql -h 主机 -U someuser somedb

它没有提示输入密码,而是登录到 postgresql。

于 2018-05-28T09:36:55.577 回答
24

虽然问题已经被回答和接受,但也可能发生 .pgpass 文件的权限设置不正确。它必须禁止世界和组访问:

/bin/chmod 0600 ~/.pgpass
于 2015-01-26T14:54:14.013 回答
16

psql( startup.c ) 调用PQconnectdbParams( fe-connect.c ),然后passwordFromFile被调用。这是一个清单,以确保将使用 pgpass 文件:

  1. 确保未设置连接字符串中的标志--password/-W和。否则,不会使用 pgpass 文件。password=
  2. 确保PGPASSWORD未设置环境变量 ( echo $PGPASSWORD)。否则,不会使用 pgpass 文件。
  3. 确保pgpass 文件位于正确的位置($PGPASSFILE或默认~/.pgpass%APPDATA%\postgresql\pgpass.conf
  4. 确保密码文件不可按组或其他方式读取、写入或执行(例如chmod 600 ~/.pgpass);否则psql将打印警告。
  5. 确保密码文件是文件(不是符号链接);否则psql将打印警告。
  6. 确保用户可以读取密码文件psql(例如cat ~/.pgpass);否则psql将忽略它而不发出警告。确保它归用户所有,并且它的所有祖先目录都可由用户执行。
  7. 确保 pgpass 文件具有正确的格式hostname:port:database:username:password密码文件passwordFromFile)。每个字段(密码除外)都可以是*. 字符:\必须被转义\:\\(即使在密码中)。密码在行尾或行尾结束,可以包含除、或:之外的任何字节。任何格式不正确或与主机和用户不匹配的行都会被忽略而不会发出警告,就好像它们是注释一样。\r\n\0
  8. 确保 pgpass 文件中该行的主机名、端口、数据库名、用户名与服务器匹配或者是*. 检查的服务器的“pwhost”是host名称(如果非空)或hostaddrIP 地址。否则,该行将被忽略而不发出警告。

不幸的是,这些文件中没有日志记录,所以如果这没有帮助,那么您可能需要自己编译psqllibpq在调试器中运行它。

于 2019-05-07T17:10:43.370 回答
5

检查 .pgpass 文件的所有者。花了半个小时才发现我已经用 sudo 创建了我的 .pgpass 文件。我的用户和位置的命令是chown postgres:postgres /var/lib/pgsql/.pgpass.

于 2018-02-07T15:33:36.887 回答
0

就我而言,是我已经设置了 PGPASSWORD 环境变量(密码错误),所以psql选择它而不是里面的内容.pgpass

于 2021-10-01T19:32:34.437 回答