postgresql:.pgpass 不起作用

问题描述 投票:0回答:8

我在我的主目录中创建了一个

.pgpass
文件,如下所示

localhost:5432:somedb:someuser:somepass

我正在使用一个 shell 脚本,它创建一个目录并将

somedb
的 pg_dump 放在那里 :

mkdir directory
pg_dump somedb > directory/somefile.dump

仍然提示输入密码。

这里错在哪里?

bash postgresql database-backups
8个回答
62
投票

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

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

45
投票
  1. 创建包含内容的 .pgpass 文件

主机:5432:somedb:someuser:somepass

  1. 设置权限

sudo chmod 600 .pgpass

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

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

  1. 设置 PGPASSFILE 环境变量:

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

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

psql -h 主机 -U someuser somedb

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


26
投票

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

/bin/chmod 0600 ~/.pgpass

22
投票

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

  1. 确保
    连接字符串
    中的标志
    --password
    /
    -W
    password=未设置。否则,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
    名称(如果非空),或者是
    hostaddr
    IP 地址。否则,该行将被忽略而不发出警告。

不幸的是,这些文件中没有日志记录,因此如果这没有帮助,那么您可能需要自己编译

psql
libpq
并在调试器中运行它。


5
投票

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

chown postgres:postgres /var/lib/pgsql/.pgpass


2
投票

就我而言,我已经设置了 PGPASSWORD 环境变量(密码错误),所以

psql
选择了它而不是里面的内容
.pgpass


0
投票

如果您的密码恰好包含冒号,则必须在其前面添加 \ 来转义,以便密码被识别。


0
投票

确保交叉检查是否有空格并将其删除。 :)

© www.soinside.com 2019 - 2024. All rights reserved.