PostgreSQL:.pgpass无法正常工作

62

我在我的主目录下创建了一个名为.pgpass的文件,内容如下:

localhost:5432:somedb:someuser:somepass

我正在使用一个 shell 脚本,它会创建一个目录并将 somedb 的 pg_dump 放进去:

mkdir directory
pg_dump somedb > directory/somefile.dump

它仍然提示输入密码。

这里有什么错误?


8
你尝试指定主机和用户了吗?pg_dump -U someuser -h localhost somedb > directory/somefile.dump - devnull
1
是的,这是一个非常愚蠢的错误。指定了用户后,它就可以工作了:D 谢谢 - Deepankar Bajpeyi
1
我曾将-W作为选项传递(这意味着“强制密码提示”)。请确保您没有这个选项(除了已接受的答案)。 - g_vk
7个回答

60

你尝试指定主机、用户和数据库了吗?

pg_dump -U someuser -h localhost somedb > directory/somefile.dump

29
.pgpass文件不是应该消除指定主机和用户的需要吗? - Ian Hunter
31
不,将用户名和主机名提供到pgpass文件中的目的是创建匹配条件。“当提供该用户名和主机名时,使用此密码”。只有在您提供要匹配的用户名和主机名时,它才能执行此匹配。 - JHixson
1
@JHixson - 我喜欢你的解释,但这是我第一次看到 .pgpass 文件以这种方式描述 - 你能提供一下那个解释的参考吗? - John Prior
5
@JohnPrior 确定,Pgpass文件的文档在这里:https://www.postgresql.org/docs/9.4/static/libpq-pgpass.html。该文件 .pgpass 可以位于用户主目录中或由 PGPASSFILE 引用的文件中,其中包含要在需要密码时使用的密码。请注意,它仅提到能够提供密码,不能用于提供除密码之外的任何内容。文档将与密码一起放入文件中的内容记录为“匹配条件”,以便查找密码。 - JHixson
3
@JohnPrior 一句更好地说明其功能的文档内容:将使用与当前连接参数匹配的第一行中的密码字段。 - JHixson
显示剩余3条评论

43
  1. 创建 .pgpass 文件并添加以下内容:

host:5432:somedb:someuser:somepass

  1. 设置文件权限:

sudo chmod 600 .pgpass

  1. 将文件的所有者设置为登录用户名:

sudo chown 登录用户名:登录用户名 .pgpass

  1. 设置 PGPASSFILE 环境变量:

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

现在通过连接到数据库检查一下:

psql -h host -U someuser somedb

它不会提示输入密码,而是直接登录到 postgresql。


2
在我的情况下,“sudo chown login_username:login_username .pgpass”解决了问题。 - Adrian
谢谢你详细的回答。我忘了指定-U <用户名>选项,所以它一直在问密码。 - F. Santiago

26

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

/bin/chmod 0600 ~/.pgpass

22

psqlstartup.c)调用PQconnectdbParamsfe-connect.c),然后调用passwordFromFile。以下是一个检查清单,以确保可以使用pgpass文件:

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

不幸的是,在这些文件中没有日志记录,所以如果这些方法都无法解决问题,则可能需要自己编译psqllibpq并在调试器中运行。


非常感谢。我一直试图在各个地方使用*,但它就是不起作用。因此,如果您正在尝试在pgpass文件中使用通配符,我建议不要这样做。 PoS代码。 - Dexter
非常感谢你,我花了两天时间设置这个文件并且一直遇到密码错误,你救了我。 - crbroflovski
1
谢谢!对我来说,从 localhost:5432:squared_development:squared:squared 更改为 localhost:5432:*:squared:squared 就解决了“不要求密码”的问题。 - Foton

5

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


2
在我的情况下,我已经设置了PGPASSWORD环境变量(为错误的密码),所以psql选择了它而不是.pgpass中的内容。

0
如果您的密码中包含冒号,您必须在冒号前加上 \ 以便密码能够被识别。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接