使用不带密码的psql命令运行批处理文件

sha*_*224 26 postgresql connection shell psql

我试图psql使用批处理脚本执行此命令:

psql --host=localhost --dbname=<dbname> --port=<Port Number>
     --username=<dbuser> --file=C:\PSQL_Script.txt --output=C:\PSQL_Output.txt
Run Code Online (Sandbox Code Playgroud)

问题是每次执行批处理脚本时都要求输入密码.如何通过批处理文件密码参数?

Erw*_*ter 46

继续阅读,最好的选择.但我们首先澄清一些事情.

只有静音密码请求

如果您的问题只是密码提示,您可以将其静音.我在这里引用手册:

-w
--no-password

永远不要发出密码提示.如果服务器需要密码验证,并且其他方式(例如.pgpass文件)无法使用密码,则连接尝试将失败.此选项在没有用户输入密码的批处理作业和脚本中非常有用.(......)

您可能不需要密码

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

local    all    postgres    peer
Run Code Online (Sandbox Code Playgroud)

通常还有:

local    all    all         peer
Run Code Online (Sandbox Code Playgroud)

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

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

大胆强调我的.
您正在连接localhost,这不是"本地连接",即使它中包含"本地"一词.它是到127.0.0.1的TCP/IP连接.localhost上的维基百科:

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

本地连接的简单解决方案

省略该参数-hpsql调用.再次引用手册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
Run Code Online (Sandbox Code Playgroud)

我只会关闭远程连接进行调试.为了更安全,您可以在Windows上使用SSPI身份验证.将此行添加到pg_hba.conf"本地"连接:

host    all    all    127.0.0.1/32     sspi
Run Code Online (Sandbox Code Playgroud)

如果你确实需要密码

可以设置环境变量,但不建议这样做,尤其是对于Windows.手册:

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

手册psql:

conninfo字符串是指定连接参数的替代:

 $ psql "user=myuser password=secret_pw host=localhost port=5432 sslmode=require"
Run Code Online (Sandbox Code Playgroud)

或者使用URI代替数据库名称:

 $ psql postgresql://myuser:secret_pw@localhost:5432/mydb?sslmode=require
Run Code Online (Sandbox Code Playgroud)

密码文件

但通常最好设置一个.pgpass文件,而不是将密码放入脚本文件中.
仔细阅读本手册中简短章节.特别要注意这里......

主机名localhost匹配来自本地计算机的TCP(主机名localhost)和Unix域套接字(pghost空或默认套接字目录)连接.

确切的路径取决于系统.此文件可以存储多个角色和端口组合(数据库集群)的密码:

localhost:5432:*:myadmin:myadminPasswd
localhost:5434:*:myadmin:myadminPasswd
localhost:5437:*:myadmin:myadminPasswd
...
Run Code Online (Sandbox Code Playgroud)

Windows机器上查找以下文件:

%APPDATA%\postgresql\pgpass.conf
Run Code Online (Sandbox Code Playgroud)

%APPDATA%通常解析为:C:\Documents and Settings\My_Windows_User_Name\Application Data\.