我正在尝试使用批处理脚本执行此psql
命令:
psql --host=localhost --dbname=<dbname> --port=<Port Number>
--username=<dbuser> --file=C:\PSQL_Script.txt --output=C:\PSQL_Output.txt
问题是每次执行批处理脚本时都要求输入密码。如何通过批处理文件密码参数?
答案 0 :(得分:44)
继续阅读, 最佳选项最后 。但我们首先澄清一些事情。
如果您的问题只是密码提示,则可以将其静音。我引用the manual here:
-w
--no-password
永远不会发出密码提示。如果服务器需要密码验证和 密码不能通过其他方式获得 一个
.pgpass
文件,连接尝试将失败。这个选项可以 在没有用户输入密码的批处理作业和脚本中很有用。 (...)
通常这是不必要的。默认数据库超级用户postgres
通常对应于同名的系统用户。如果在 psql
文件中设置了authentication method peer
或ident
,则从此帐户运行pg_hba.conf
不需要输入密码。你可能有这样的一行:
local all postgres peer
通常也是:
local all all peer
这意味着,每个本地用户都可以作为没有密码的同名数据库用户登录到 all 数据库。
然而,这里有一个常见的误解。 Quoting again:
此方法仅支持本地连接。
大胆强调我的
您正在连接 localhost
,即不是“本地连接”,即使其中包含“本地”一词。它是到127.0.0.1的TCP / IP连接。 Wikipedia on localhost:
在现代计算机系统上,
localhost
作为主机名转换为127.0.0.0/8
(环回)网络块中的IPv4地址,通常为127.0.0.1
或IPv6中的::1
。
从-h
调用中省略参数psql
。再次引用the manual on psql
:
如果省略主机名,psql将通过Unix域套接字连接 到本地主机上的服务器,或通过TCP / IP到机器上的
localhost
那些没有Unix域套接字。
...没有Unix域套接字,以pg_hba.conf
开头的local
行不适用于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
的行为与password连接相同 参数。建议不要使用此环境变量 出于安全原因,某些操作系统允许非root用户 用户通过ps查看进程环境变量;代替 考虑使用~/.pgpass
文件(请参阅Section 32.15)。
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
file而不是将密码放入脚本文件中
阅读short chapter in the manual carefully。特别要注意这里......
主机名
localhost
匹配来自本地计算机的TCP(主机名localhost
)和Unix域套接字(pghost
为空或默认套接字目录)连接。
确切路径取决于系统。此文件可以存储多个角色和端口组合(数据库集群)的密码:
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 :(得分:1)
我有同样的问题:
psql -hlocalhost -d<myDB> -U<myUser>
总是提示我输入密码。正如@Erwin解释的那样,因为-hlocalhost
通过TCP而不是通过Unix域套接字(基于Unix的OS)连接。因此,即使您已将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
一些额外的读物:
答案 2 :(得分:0)
postgres文档-https://www.postgresql.org/docs/9.6/static/app-psql.html
-w -无密码 切勿发出密码提示。如果服务器要求密码验证,而其他方式(例如.pgpass文件)无法使用密码,则连接尝试将失败。此选项在没有用户输入密码的批处理作业和脚本中很有用。
答案 3 :(得分:0)
我发现了将连接字符串传递给命令的技巧,即
10
`示例:
$ psql postgresql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}
这样,如果您必须传入数据库密码,但又不想继续在提示中传递,则可以在 bash 文件中执行此操作。