使用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方法peer
或ident
则从此帐户运行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
手册 :
conninfo
string是指定连接参数的替代方法:
$ 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方式:信任,对等,身份等