继续阅读,最好的选项排在最后。但让我们先澄清几件事。
只静默密码请求
如果您的问题只是密码提示,您可以将其静音。我引用the manual here:
-w
--no-password
永远不要发出密码提示。如果服务器需要密码验证并且
无法通过其他方式获得密码,例如
.pgpass 文件,连接尝试将失败。这个选项可以
在没有用户输入密码的批处理作业和脚本中很有用。 (...)
您可能不需要密码
通常这是不必要的。默认的数据库超级用户postgres通常对应同名的系统用户。如果在您的 pg_hba.conf 文件中设置了authentication method peer 或ident,则从此帐户运行psql 不需要密码。你可能有这样的一行:
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。
本地连接的简单解决方案
从psql 调用中省略参数-h。再次引用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)。
The manual on psql:
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\。