postgresql:.pgpass无法正常工作

Dee*_*eyi 24 postgresql bash database-backups

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

localhost:5432:somedb:someuser:somepass

我正在使用一个shell脚本创建一个目录并在其中放置一个pg_dump somedb:

mkdir directory
pg_dump somedb > directory/somefile.dump
Run Code Online (Sandbox Code Playgroud)

它仍然提示输入密码.

这里的错误在哪里?

dev*_*ull 25

您是否尝试指定主机和用户?

pg_dump -U someuser -h localhost somedb > directory/somefile.dump
Run Code Online (Sandbox Code Playgroud)

  • 是不是.pgpass文件应该不需要指定主机和用户? (16认同)
  • @IanHunter不,在pgpass文件中提供用户名和主机的目的是创建匹配条件."当提供此用户名和主机时,请使用此密码".如果你给它一个用户名和主机匹配,它只能执行这个匹配, (12认同)
  • @JohnPrior肯定,Pgpass文件的文档:https://www.postgresql.org/docs/9.4/static/libpq-pgpass.html`用户主目录中的.pgpass文件或PGPASSFILE引用的文件可以包含如果连接需要密码,则使用密码.请注意它是如何仅提及能够提供密码的.它不能用于提供任何*但*密码.为了查找密码,您在密码文件中放入的内容将记录为"匹配条件". (3认同)
  • @JohnPrior 文档中的一行更好地说明了功能:`将使用与当前连接参数匹配的第一行的密码字段。` (2认同)

Nac*_*dra 20

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

/bin/chmod 0600 ~/.pgpass
Run Code Online (Sandbox Code Playgroud)


yon*_*ran 13

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

  1. 确保标志--password/-Wpassword=连接字符串都没有设置。否则,将不会使用 pgpass 文件。
  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在调试器中运行它。


Shr*_*vas 10

1)创建包含内容的.pgpass文件

主机:5432:somedb:someuser:somepass

2)使用命令设置权限

须藤chmod 600 .pgpass

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

sudo chown login_username:login_username .pgpass

4)设置PGPASSFILE环境变量:

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

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

psql -h host -U someuser somedb

它不会提示输入密码并登录到postgresql。

  • 就我而言,“sudo chown login_username:login_username .pgpass”就成功了。 (2认同)

Jon*_*han 5

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