【问题标题】:dblink doesn't use the .pgpass filedblink 不使用 .pgpass 文件
【发布时间】:2016-06-23 12:37:22
【问题描述】:

我不知道我的设置有什么问题,但是当我尝试使用

连接到数据库时
psql -h {db address} -U {username} -w {db name}

它工作正常,所以 .pgpass 文件没问题。 但是如果我连接到本地数据库,然后试试这个:

select dblink_connect_u( 'conName', 'hostaddr={address} port={port} dbname={dbName} user={userName} ' );

我得到错误:

ERROR:  could not establish connection
DETAIL:  fe_sendauth: no password supplied

在连接字符串中有密码,它工作得很好,但我不希望任何人都能看到密码。 知道为什么要这样做吗?

Postgres 版本:9.3

编辑: 操作系统:postgres 正在我的计算机(win7)和远程服务器(Ubuntu 服务器 14.04)上运行。在 Windows 中,pgpass.conf 文件是:Users/Myuser/AppData/Roaming/postgres/pgpass.conf,在 Ubuntu 上:/var/lib/postgres/.pgpass 但我也尝试在本地和远程服务器上使用 Ubuntu,使用相同的 .pgpass 位置,并且 postgres 进程以 postgres 用户身份运行,但结果是一样的。

.pgpass 文件内容:

192.168.1.47:5432:*:remoteusername:remotepassword 192.168.1.46:5432:*:localusername:localpassword

这两个数据库不在同一台机器上。

更新
这似乎是一个 IP 地址解析问题,因为当我尝试使用 dblink_conncet_u() 和 'hostaddr=ip_address_here' 时它不起作用。但是,当我将主机名而不是 IP 地址放在 .pgpass 文件中,并在连接字符串中使用 'host=hostname_here' 时,它工作正常。

【问题讨论】:

  • 您没有提供任何重要的细节。 Postgres 版本、操作系统、.pgpass 文件的内容。您是否连接到同一机器上同一端口上的同一数据库集群?等等。
  • @ErwinBrandstetter 你是对的。帖子已更新。
  • .pgpass 在哪里?在客户端计算机(运行 SQL 的地方)还是服务器(运行 Postgres 的地方)?
  • @a_horse_with_no_name 帖子已编辑。但是 .pgpass 文件没有问题。当我将 psql 命令与 -w 一起使用时。只有dblink_connect_u 有这个问题。我知道我可以编辑目标服务器上的 pg_hba.conf 文件以信任我的 IP,但这也不是一个好的解决方案。

标签: postgresql authentication dblink


【解决方案1】:

现在,db_link() 将作为用户 postgres 在后端服务器进程上运行。

您的.pgpass 文件是否位于数据库计算机上用户 postgres 的正确位置?

如果不是,你希望它如何被阅读?


我想你一定错过了什么:

# ls -l /var/lib/postgresql/.pgpass 
-rw------- 1 root root 79 Jun 24 08:10 /var/lib/postgresql/.pgpass

(meanwhile, in psql...)
dblinklocal=# SELECT dblink_connect('conn1', 'hostaddr=127.0.0.1 port=5432 dbname=dblinkremote user=testuser');
ERROR:  could not establish connection
DETAIL:  fe_sendauth: no password supplied

# chown postgres:postgres .pgpass
dblinklocal=# SELECT dblink_connect('conn1', 'hostaddr=127.0.0.1 port=5432 dbname=dblinkremote user=testuser');
 dblink_connect 
----------------
 OK
(1 row)

【讨论】:

  • .pgpass 文件位于 /var/lib/postgres/ 这是用户 postgres 的主目录。并且文件模式设置为 0600。postgres 进程在两台机器上都以用户 postgres 的身份运行。而且这两个.pgpass文件内容是一样的。
  • 是的,我一定错过了什么,但不是这个。 # ls -l /var/lib/postgresql/.pgpass -rw------- 1 postgres postgres 163 jun 24 09:40/var/lib/postgresql/.pgpasspostgres用户和组拥有,问题不存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多