使用psql命令不带密码运行batch file

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

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

问题是每次执行批处理脚本时都要求input密码。 如何通过batch file密码参数?

关于无密码login的问题不断popup。 继续阅读, 最好的select最后 。 但是让我们先澄清几件事。

只有密码请求无声

如果你的问题只是密码提示,你可以沉默它。 我在这里引用手册 :

-w
--no-password

切勿发出密码提示。 如果服务器需要密码身份validation,并且通过其他方式(如.pgpass文件)无法使用密码,则连接尝试将失败。 这个选项在没有用户input密码的批处理作业和脚本中很有用。 (……)

你可能不需要密码

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

 local all postgres peer 

而且通常也是:

 local all all peer 

这意味着,每个本地用户都可以作为没有密码的同名数据库用户login到所有数据库。
但是 ,这里有个常见的误解。 再次引用 :

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

大胆重视我的。
您正在连接到localhost ,它不是“本地连接” ,即使其中包含“本地”一词。 这是到127.0.0.1的TCP / IP连接。 维基百科on localhost :

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

本地连接的简单解决scheme

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

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

视窗

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

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

 host all all 127.0.0.1/32 trust 

我只会这样做,远程连接closuresdebugging。 为了更安全一些,您可以在Windows上使用SSPI身份validation 。 将这一行添加到pg_hba.conf以获得“本地”连接:

 host all all 127.0.0.1/32 sspi 

如果你真的需要密码

可以设置一个环境variables ,但是这是不鼓励的 ,尤其是对于Windows。 手册:

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

psql手册 :

conninfostring是指定连接参数的替代方法:

  $ 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空或默认套接字目录)连接。

确切的path取决于系统。 此文件可以为angular色和端口(数据库集群)的多个组合提供密码:

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

Windows机器上查找文件:

 C:\Documents and Settings\My_Windows_User_Name\Application Data\postgresql 

我有一个同样的问题:

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

总是提示我input密码。 这是因为@Erwin解释是因为-hlocalhost通过TCP而不是通过Unix域套接字(用于基于Unix的操作系统)连接。 所以,即使你已经configuration你的local信任:

 local all all trust 

它仍然会提示input密码。 所以为了configuration-hlocalhost通过TCP工作,我必须configurationhost的localhost地址,如下所示:

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

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

 host all all localhost trust 

一些额外的读数:

  • configurationpg_hba.conf文件
  • authentication方式:信任,对等,身份等