当前位置: 首页 > 知识库问答 >
问题:

使用不带密码的psql命令运行批处理文件

徐弘图
2023-03-14

我试图使用批处理脚本执行这个psql命令:

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

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

共有3个答案

申屠宗清
2023-03-14

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

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

傅朝
2023-03-14
匿名用户

我也有同样的问题:

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

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

local   all    all                     trust

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

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

但这对我不起作用。我要做的是将这两种方法结合起来:

host    all    all    localhost        trust

一些额外的读数:

  • 配置pg_hba.conf文件
  • 认证方式:信任、对等、ident等

漆雕正奇
2023-03-14

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

如果您的问题只是密码提示,您可以使其静音。我在此引述该手册:

-w
--无密码

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

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

local    all    postgres    peer

通常还包括:

local    all    all         peer

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

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

粗体强调我的。
您正在连接到localhost,它不是“本地连接”,即使其中有“本地”一词。它是到127.0.0.1的TCP/IP连接。本地主机上的维基百科:

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

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

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

... 没有Unix域套接字,pg_hba.conflocal开头的行不适用于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空或默认套接字目录)连接相匹配。

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

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

在Windows计算机上,在以下位置查找文件:

%APPDATA%\postgresql\pgpass.conf

%APPDATA%通常解析为:C:\Documents and Settings\My\u Windows\u User\u Name\Application Data\

 类似资料:
  • 我正在试着制作一个定制的发射器,但我不知道如何使用命令行来启动minecraft。我看到了这个问题:从命令行启动Minecraft-使用名称和密码作为前缀。但是答案根本不起作用,所以有人能告诉我如何使用以用户名和密码为前缀的命令行启动minecraft吗

  • 我不知道如何使用调用Spring批处理中定义的作业,文档细节对我来说是不够的。 我遵循了Spring Batch官方指南,使用Java注释(例如)在Spring Batch中编写作业,因为我希望避免使用XML配置文件来描述作业、步骤等。 到目前为止我已经: 配置类(见下文),我使用AnnotaIon将定义、、、和(带有的所有内容放入其中。 具有方法的类,该方法具有并具有注释,以导入处理作业中的数据

  • 在本章中,我们来看一看一些经常使用的批处理命令。如下图中所示 - 编号 命令 描述 1 VER 此批处理命令显示正在使用的MS-DOS的版本。 2 ASSOC 这是将扩展名与文件类型(FTYPE)相关联的批处理命令,显示现有关联或删除关联。 3 CD 此批处理命令用于更改进入不同的目录,或显示当前目录。 4 CLS 这个批处理命令清除屏幕。 5 COPY 此批处理命令用于将文件从一个位置复制到另一

  • 在Windows中,如何访问批处理文件运行时传递的参数? 例如,假设我有一个名为< code>hello.bat的程序。当我在Windows命令行输入< code>hello -a时,如何让我的程序知道< code>-a是作为参数传入的?

  • 我创建了一个Windows批处理文件来启动我的Play Framework应用程序,详情如下:Play Framework bat Windows java process 这是可行的,但当我尝试添加命令行标志以指定生产配置文件时,会收到“Not a Play application”(非播放应用程序)错误消息: 我的两个问题是: “%1”和“.”是什么意思向java启动器表示 如何在Window