我正在尝试使用批处理脚本执行此psql
命令:
psql --host=localhost --dbname=<dbname> --port=<Port Number>
--username=<dbuser> --file=C:\PSQL_Script.txt --output=C:\PSQL_Output.txt
问题在于每次执行批处理脚本时都要求密码。如何通过批处理文件传递密码参数?
我正在尝试使用批处理脚本执行此psql
命令:
psql --host=localhost --dbname=<dbname> --port=<Port Number>
--username=<dbuser> --file=C:\PSQL_Script.txt --output=C:\PSQL_Output.txt
问题在于每次执行批处理脚本时都要求密码。如何通过批处理文件传递密码参数?
请继续阅读,最佳选项最后出现。但是首先让我们澄清一些事情。
如果你的问题仅是密码提示,你可以将其静音。我在此引用手册中的内容:
-w
--no-password
从不发出密码提示。如果服务器需要密码验证并且没有其他方式(例如
.pgpass
文件)提供密码,则连接尝试将失败。此选项可用于批处理作业和脚本,其中没有用户输入密码。(...)
postgres
通常对应于同名的系统用户。如果在您的pg_hba.conf
文件中设置了认证方法peer
或ident
,则从此帐户运行psql
不需要密码。您可能有这样一行代码:local all postgres peer
通常也包括:
local all all peer
此方法仅在本地连接上受支持。
加粗强调是我的。
您正在连接到localhost
,它虽然有“local”一词,但并不是“本地连接”,而是到127.0.0.1的TCP / IP连接。Wikipedia对localhost的解释:
在现代计算机系统中,
localhost
作为主机名转换为127.0.0.0/8
(环回)网络块中的IPv4地址,通常为127.0.0.1
,或者在IPv6中为::1
。
psql
调用中省略参数-h
。再次引用psql
的手册:
如果省略主机名,psql将通过Unix域套接字连接到本地主机上的服务器,或者通过TCP/IP连接到在没有Unix域套接字的机器上的
localhost
。
... 没有Unix域套接字,在Windows上以local
开头的pg_hba.conf
行不适用。在Windows上,默认情况下通过localhost
连接,这使我们回到了起点。
如果您的安全要求不高,可以信任所有通过localhost
的连接:
host all all 127.0.0.1/32 trust
pg_hba.conf
中:host all all 127.0.0.1/32 sspi
您可以设置一个环境变量,但这在Windows系统下是不鼓励的。 手册:
PGPASSWORD
与密码连接参数的行为相同。出于安全原因,不建议使用此环境变量,因为某些操作系统允许非root用户通过ps命令查看进程环境变量;而应该考虑使用~/.pgpass
文件(请参阅第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
文件比将密码放入脚本文件中更可取。
仔细阅读手册中的简短章节。特别注意,在这里...
主机名为
localhost
同时匹配来自本地计算机的TCP连接(主机名为localhost
)和Unix域套接字(pghost
为空或默认套接字目录)。
确切路径取决于系统。该文件可以存储多个角色和端口(DB集群)的密码组合:
localhost:5432:*:myadmin:myadminPasswd
localhost:5434:*:myadmin:myadminPasswd
localhost:5437:*:myadmin:myadminPasswd
...
中的文件:
%APPDATA%\postgresql\pgpass.conf
%APPDATA%
通常解析为:C:\Documents and Settings\My_Windows_User_Name\Application Data\
。
psql -hlocalhost -d<myDB> -U<myUser>
我经常被要求输入密码。正如 @Erwin 解释的那样,这是因为 -hlocalhost
是通过 TCP 连接而不是 Unix 域套接字连接(针对基于 Unix 的操作系统)。因此,即使您已将 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
一些额外阅读材料:
Postgres文档 - https://www.postgresql.org/docs/9.6/static/app-psql.html
-w --no-password 从不提示输入密码。如果服务器需要密码验证,而没有其他方式(如.pgpass文件)提供密码,则连接尝试将失败。此选项可用于批处理作业和脚本,其中没有用户输入密码。
$ psql postgresql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}
`例子:
$ psql postgresql://user:password@127.0.0.1:5432/database
如果你需要传递数据库密码,但又不想一直在提示中输入,你可以在你的bash文件中这样做。