psql --host=localhost --dbname=<dbname> --port=<Port Number> --username=<dbuser> --file=C:\Psql_Script.txt --output=C:\Psql_Output.txt
问题是每当我执行批处理脚本时都要求密码。如何通过批处理文件进行密码参数?
只能静音密码请求
如果您的问题只是密码提示,您可以将其静音。我引用the manual here:
-w
--no-password
Never issue a password prompt. If the server requires password authentication and
a password is not available by other means such as
a.pgpass
file,the connection attempt will fail. This option can be
useful in batch jobs and scripts where no user is present to enter a password. (…)
你可能不需要密码
通常这是不必要的。默认数据库超级用户postgres通常对应于同名的系统用户。如果在pg_hba.conf文件中设置了authentication method peer
或ident,则从该帐户运行psql不需要密码。你可能有这样的一行:
local all postgres peer
通常也是:
local all all peer
这意味着,每个本地用户都可以登录到具有相同名称的数据库用户的所有数据库,而无需密码。
然而,这里有一个常见的误解。 Quoting again:
This method is only supported on local connections.
大胆强调我的
您正在连接到本地主机,这不是“本地连接”,即使它具有单词“本地”。这是一个到127.0.0.1的TCP / IP连接。 Wikipedia on localhost:
On modern computer systems,
localhost
as a hostname translates to an
IPv4 address in the127.0.0.0/8
(loopback) net block,usually127.0.0.1
,or::1
in IPv6.
本地连接的简单解决方案
从psql调用中省略参数-h。再次报价the manual on psql
:
If you omit the host name,psql will connect via a Unix-domain socket
to a server on the local host,or via TCP/IP tolocalhost
on machines
that don’t have Unix-domain sockets.
视窗
…没有Unix域套接字,从本地开始的pg_hba.conf行不适用于Windows。在Windows上,默认情况下通过localhost连接,这使我们重新开始。
如果您的安全要求较为松散,则可以通过localhost信任所有连接:
host all all 127.0.0.1/32 trust
我只会用远程连接断开调试。对于更多的安全性,您可以在Windows上使用SSPI authentication。将此行添加到pg_hba.conf中用于“本地”连接:
host all all 127.0.0.1/32 sspi
如果您确实需要密码
您可以设置一个环境变量,但这是不鼓励的,特别是对于Windows。 The manual:
PGPASSWORD
behaves the same as the 07007 connection
parameter. Use of this environment variable is not recommended
for security reasons,as some operating systems allow non-root
users to see process environment variables via ps; instead
consider using the~/.pgpass
file (see 07008).
$ psql "user=myuser password=secret_pw host=localhost port=5432 sslmode=require"
$ psql postgresql://myuser:secret_pw@localhost:5432/mydb?sslmode=require
密码文件
但是通常最好设置一个.pgpass
file,而不是将密码放入脚本文件。
阅读short chapter in the manual carefully.特别是请注意这里…
A host name of
localhost
matches both TCP (host namelocalhost
) and Unix domain socket (pghost
empty or the default socket directory) connections coming from the local machine.
确切的路径取决于系统。此文件可以为角色和端口(DB集群)的多个组合的密码:
localhost:5432:*:myadmin:myadminPasswd localhost:5434:*:myadmin:myadminPasswd localhost:5437:*:myadmin:myadminPasswd ...
在Windows机器上查找文件:
C:\Documents and Settings\My_Windows_User_Name\Application Data\postgresql