29

我正在尝试psql使用批处理脚本执行此命令:

psql --host=localhost --dbname=<dbname> --port=<Port Number>
     --username=<dbuser> --file=C:\PSQL_Script.txt --output=C:\PSQL_Output.txt

问题是每次我执行批处理脚本时它都要求输入密码。如何通过批处理文件输入密码参数?

4

4 回答 4

58

继续阅读,最好的选择排在最后。但是,让我们首先澄清几件事。

仅使密码请求静音

如果您的问题只是密码提示,您可以将其静音。我在这里引用手册

-w
--no-password

永远不要发出密码提示。如果服务器需要密码验证,而密码不能通过文件等其他方式获得.pgpass,则连接尝试将失败。此选项在没有用户输入密码的批处理作业和脚本中很有用。(...)

您可能不需要密码

通常这是不必要的。默认的数据库超级用户postgres通常对应同名的系统用户。如果身份验证方法或在您的文件中设置,则从此帐户运行psql不需要密码。你可能有这样的一行:peeridentpg_hba.conf

local    all    postgres    peer

通常还有:

local    all    all         peer

这意味着,每个本地用户都可以以同名数据库用户的身份登录到所有数据库,而无需密码。
但是,这里有一个常见的误解。再次引用

此方法仅在本地连接上受支持。

大胆强调我的。
您正在连接到localhost,这不是“本地连接”,即使其中包含“本地”一词。这是到 127.0.0.1 的 TCP/IP 连接。本地主机上的维基百科

在现代计算机系统上,主机名通常会转换为(环回)网络块localhost中的 IPv4 地址,或者在 IPv6 中。127.0.0.0/8127.0.0.1::1

本地连接的简单解决方案

-hpsql调用中省略参数。再次引用手册:psql

如果省略主机名,psql 将通过 Unix 域套接字连接 到本地主机上的服务器,或通过 TCP/IP 连接到localhost没有 Unix 域套接字的机器上。

视窗

... 没有 Unix 域套接字,pg_hba.conf以开头的行local不适用于 Windows。在 Windows 上,您localhost默认通过连接,这使我们回到开始。

如果您的安全要求不严格,您可以通过以下方式信任所有连接localhost

host    all    all    127.0.0.1/32     trust

我只会在关闭远程连接的情况下进行调试。为了获得更高的安全性,您可以在 Windows 上使用SSPI 身份验证。将此行添加到pg_hba.conf“本地”连接:

host    all    all    127.0.0.1/32     sspi

如果您确实需要密码

可以设置环境变量,但不鼓励这样做,尤其是对于 Windows。手册:

PGPASSWORD行为与密码连接参数相同。出于安全原因,不建议使用此环境变量,因为某些操作系统允许非 root 用户通过 ps 查看进程环境变量;而是考虑使用该~/.pgpass文件(参见第 32.15 节)。

手册psql

字符串conninfo是指定连接参数的替代方法:

 $ psql "user=myuser password=secret_pw host=localhost port=5432 sslmode=require"

URI,用于代替数据库名称:

 $ psql postgresql://myuser:secret_pw@localhost:5432/mydb?sslmode=require

密码文件

但通常最好设置一个.pgpass文件,而不是将密码放入脚本文件中。
仔细阅读手册中的简短章节。特别要注意的是,这里...

主机名localhost匹配来自本地机器的TCP(主机名localhost)和 Unix 域套接字(空或默认套接字目录)连接。pghost

确切路径取决于系统。此文件可以存储角色和端口(数据库集群)的多种组合的密码:

localhost:5432:*:myadmin:myadminPasswd
localhost:5434:*:myadmin:myadminPasswd
localhost:5437:*:myadmin:myadminPasswd
...

Windows机器上查找文件:

%APPDATA%\postgresql\pgpass.conf

%APPDATA%通常解析为:C:\Documents and Settings\My_Windows_User_Name\Application Data\.

于 2013-03-23T23:01:13.607 回答
1

我遇到了同样的问题:

psql -hlocalhost -d<myDB> -U<myUser>

总是提示我输入密码。正如@Erwin 解释的那样,因为-hlocalhost它是通过 TCP 连接而不是通过 Unix 域套接字(对于基于 Unix 的操作系统)。因此,即使您已将您的配置local为受信任:

local   all    all                     trust

它仍然会提示输入密码。因此,为了配置-hlocalhost通过 TCP 工作,我必须配置hostlocalhost 地址,如下所示:

host    all    all    127.0.0.1/32     trust
host    all    all    ::1/128          trust

但这对我不起作用。我所要做的就是将这两者结合起来:

host    all    all    localhost        trust

一些额外的阅读:

于 2015-11-19T10:12:22.463 回答
0

我发现了这种将连接字符串传递给命令的技巧,即

$ psql postgresql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}

`例子:

$ psql postgresql://user:password@127.0.0.1:5432/database

这样,如果您必须传递数据库密码但又不想在提示符中继续传递它,您可以在 bash 文件中执行此操作。

于 2021-03-16T23:24:44.200 回答
0

postgres 文档 - https://www.postgresql.org/docs/9.6/static/app-psql.html

-w --no-password 从不发出密码提示。如果服务器需要密码验证并且密码不能通过其他方式(例如 .pgpass 文件)获得,则连接尝试将失败。此选项在没有用户输入密码的批处理作业和脚本中很有用。

于 2018-09-28T12:28:25.887 回答