【问题标题】:postgresql: .pgpass not working on Windows / cygwinpostgresql:.pgpass 在 Windows / cygwin 上不起作用
【发布时间】:2020-05-28 19:18:57
【问题描述】:

我无法让 .pgpass 在 Windows/cygin 上工作

我在 Windows 10 上安装了 pgAdmin4,psql 版本 12.0。

我正在使用 cygwin,编写 bash 脚本来对安装有云提供商的 PG 数据库执行各种操作。

如果我在 bash 脚本中指定这些环境变量,一切都会很好:

export PGUSER=<pguser>
export PGPASSWORD=<pgpassword>
export PGHOSTADDR=<ip-address>
export PGPORT=5432

但如果相反,我不在 bash 脚本中包含这些环境变量并创建一个 .pgpass 文件:$HOME/.pgpass 并输入如下行:

hostname:port:database:username:password

并运行脚本,它会尝试连接到“localhost”,就好像找不到 .pgpass 文件一样。


我收到此错误:

Running: [./myscript.sql]

psql: error: could not connect to server: could not connect to server: Connection refused (0x0000274D/10061)
        Is the server running on host "localhost" (::1) and accepting
        TCP/IP connections on port 5432?
could not connect to server: Connection refused (0x0000274D/10061)
        Is the server running on host "localhost" (127.0.0.1) and accepting
        TCP/IP connections on port 5432?


我尝试像这样在 bash 脚本中明确指定:

export PGPASSFILE=$HOME/.pgpass

它仍然不起作用,我收到相同的错误消息,它忽略了 PGPASSFILE 环境变量。


我将 .pgpass 文件的权限设置为 0600,所以这不是问题。

ls -l .pgpass
-rw------- 1 <user> None 49 Feb 12 23:01 .pgpass

【问题讨论】:

  • 我会使用进程监视器来查看psql 在哪里寻找文件。
  • pgAdmin4 不是 Cywin 程序,那么 HOME 对它意味着什么? @LaurenzAlbe 的建议是个好主意
  • 'psql' 是一个 Windows 程序,我正在运行 'psql' 这是一个为 Windows 编译的 .exe。我可以在 Cygwin 中运行 .exe 程序,因为 Cygwin 是 Windows 编译的应用程序。
  • > 我会使用进程监视器来查看 psql 在哪里寻找文件。我搜索了 Process Monitor,找到了它(Microsoft Sysinternals),下载并安装了它,这是一大堆废话,不让我做你推荐的事情。我假设你使用 cygwin 并且有一个 $HOME/.pgpass 并且它正在工作?否则你不会对此作出回应。它冻结了,它不允许我搜索和过滤任何我能看到的进程,我有许多进程正在运行,当我运行我的 psql 脚本时,我永远无法在列表中找到它来遵循这个建议。跨度>
  • 我已经尝试了一切,没有办法编写 bash 脚本,使用 'psql.exe' 并让它在任何地方读取 .pgpass 文件或 pgpass.conf。 pgAdmin/psql 的开发人员在 windows 上遗漏了一些东西,就是读取这个文件。

标签: postgresql cygwin psql


【解决方案1】:

进入控制面板>点击管理工具>打开服务>找到postgresql-x64-13并启动服务。enter image description here

这对我有用。

【讨论】:

    【解决方案2】:

    我正在使用 cygwin postgresql 客户端 12.6。我尝试了这里提到的所有内容,没有运气!

    在 cygwin 上有一个使用 db 密码的解决方法 首先尝试下面的 psql 调用,对于我的 cygwin 版本,我必须在密码周围添加单引号才能使其工作

    psql postgresql://username:password@server:port:database
    

    然后将其添加到函数中的.bashrc

    function dbcall {
        psql postgresql://username:password@server:port:database
    }
    

    别忘了:source .bashrc

    问题解决了!

    另一种解决方法是尝试 WSL。自首次发布以来,Microsoft 修复了许多 WSL 问题。

    【讨论】:

      【解决方案3】:

      运行脚本,它会尝试连接到 'localhost',就好像找不到 .pgpass 文件一样。

      .pgpass 不会告诉 libpq(这是 psql 使用的)要连接到哪个主机。相反,libpq 首先确定主机,然后在 .pgpass 中查找该特定主机(或通配符)。所以这里的问题似乎是 PGHOSTADDR,而不是 .pgpass。

      【讨论】:

      • 没有找到 $HOME/.pgpass 文件。我仔细检查了 .pgpass 文件,PGHOSTADDR 设置了 IP 地址(nu.mb.er.s),它没有设置为“localhost”。如果 PGHOSTADDR 有错误的 IP,它至少会说无法连接到该 IP,但它正在尝试使用 localhost,如果找不到 .pgpass 文件,它将使用它。 HOME env var 在我的个人 env var 设置中在 Windows 10 上设置。
      • 对此的唯一回应是完全错误的。我在 .pgpass 中正确设置了 PGHOSTADDR。如果有人有任何想法并且 .pgpass 在 cygwin 下的 Windows 上工作,我愿意接受新想法。没有人在 Windows 上通过 cygwin 使用 Postgres?
      • 您说当您没有在脚本中设置 PGHOSTADDR 时存在问题。如果不设置,怎么设置为nu.mb.er.s?
      • "没有人在 Windows 上使用带有 cygwin 的 Postgres 吗?"我已经使用它并且它有效,至少就psql 而言。 .pgpass 有效,PGPASSFILE 有效,PGHOSTADDR 有效(如果您设置了它)。唯一的问题似乎是您虚构了它们的工作原理,并且不愿意学习。
      • 我不相信你有它的工作。如果您这样做,请发布在 cygwin 中运行的 bash 脚本的视频,从 .pgpass 读取,证明这一点。我正确设置了 PGHOSTADDR。在我的 cmets 中,我绝对没有任何建议(如您所建议的那样)它们是如何工作的,我不认为,我也没有发布任何与它们的工作方式相关的内容,或者对它们的工作方式的任何误解,或者我可以从中得出的任何东西我不愿意学习 - 我没有看到关于如何让它发挥作用或任何相关的信息的回应,这将有助于这一点。我正确设置了 PGHOSTADDR,并且它可以硬编码
      猜你喜欢
      • 1970-01-01
      • 2017-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-08
      • 1970-01-01
      • 1970-01-01
      • 2012-11-15
      相关资源
      最近更新 更多