无密码使用psql命令运行批处理文件

31

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

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

问题在于每次执行批处理脚本时都要求密码。如何通过批处理文件传递密码参数?

4个回答

59

请继续阅读,最佳选项最后出现。但是首先让我们澄清一些事情。

只需静音密码请求

如果你的问题仅是密码提示,你可以将其静音。我在此引用手册中的内容:

-w
--no-password

从不发出密码提示。如果服务器需要密码验证并且没有其他方式(例如 .pgpass 文件)提供密码,则连接尝试将失败。此选项可用于批处理作业和脚本,其中没有用户输入密码。(...)

你可能不需要密码

通常情况下这是不必要的。默认的数据库超级用户postgres通常对应于同名的系统用户。如果在您的pg_hba.conf文件中设置了认证方法peerident,则从此帐户运行psql不需要密码。您可能有这样一行代码:
local    all    postgres    peer

通常也包括:

local    all    all         peer

这意味着,每个本地用户都可以作为同名的数据库用户登录到所有数据库中,而无需密码。
然而,这里存在一个常见误解。再次引用:

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

加粗强调是我的。
您正在连接到localhost,它虽然有“local”一词,但并不是“本地连接”,而是到127.0.0.1的TCP / IP连接。Wikipedia对localhost的解释

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

本地连接的简单解决方案

psql调用中省略参数-h。再次引用psql的手册

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

Windows

... 没有Unix域套接字,在Windows上以local开头的pg_hba.conf行不适用。在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为空或默认套接字目录)。

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

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\


1
我有一个类似的问题:

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

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

local   all    all                     trust

它仍然会提示输入密码。因此,为了配置-hlocalhost通过TCP工作,我不得不配置host以适用于本地地址,如下所示:

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

但这对我没用。我必须将它们结合起来,如下所示:
host    all    all    localhost        trust

一些额外阅读材料:


0

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

-w --no-password 从不提示输入密码。如果服务器需要密码验证,而没有其他方式(如.pgpass文件)提供密码,则连接尝试将失败。此选项可用于批处理作业和脚本,其中没有用户输入密码。


0
我发现了一种通过传递连接字符串到命令的黑客方法。
$ psql postgresql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}

`例子:

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

如果你需要传递数据库密码,但又不想一直在提示中输入,你可以在你的bash文件中这样做。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接