3 回答
TA贡献2080条经验 获得超4个赞
继续阅读,最好的选择。但我们首先澄清一些事情。
只有静音密码请求
如果您的问题只是密码提示,您可以将其静音。我在这里引用手册:
-w
--no-password
永远不要发出密码提示。如果服务器需要密码验证,并且其他方式(例如
.pgpass
文件)无法使用密码,则连接尝试将失败。此选项在没有用户输入密码的批处理作业和脚本中非常有用。(......)
您可能不需要密码
通常这是不必要的。默认数据库超级用户postgres
通常对应于同名的系统用户。psql
如果使用身份验证方法peer
或ident
在pg_hba.conf
文件中设置,则从此帐户运行不需要密码。你可能有这样的一行:
local all postgres peer
通常还有:
local all all peer
这意味着,每个本地用户都可以作为没有密码的同名数据库用户登录到所有数据库。
但是,这里存在一种常见的误解。再次引用:
仅在本地连接上支持此方法。
大胆强调我的。
您正在连接localhost
,这不是“本地连接”,即使它中包含“本地”一词。它是到127.0.0.1的TCP / IP连接。localhost上的维基百科:
在现代计算机系统上,
localhost
作为主机名127.0.0.0/8
,通常127.0.0.1
或::1
在IPv6中转换为(环回)网络块中的IPv4地址。
本地连接的简单解决方案
省略该参数-h
从psql
调用。再次引用手册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身份验证。将此行添加到pg_hba.conf
“本地”连接:
host all all 127.0.0.1/32 sspi
如果你确实需要密码
您可以设置环境变量,但不建议这样做,尤其是对于Windows。手册:
PGPASSWORD
行为与密码连接参数相同。出于安全原因,不建议使用此环境变量,因为某些操作系统允许非root用户通过ps查看进程环境变量; 而是考虑使用该~/.pgpass
文件(参见第32.15节)。
手册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
文件,而不是将密码放入脚本文件中。
请仔细阅读本手册中的简短章节。特别要注意这里......
主机名
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\
。
TA贡献1852条经验 获得超7个赞
我有同样的问题:
psql -hlocalhost -d<myDB> -U<myUser>
总是提示我输入密码。正如@Erwin解释的那样,因为它-hlocalhost
是通过TCP连接而不是通过Unix域套接字(基于Unix的操作系统)。所以,即使您已将自己配置local
为受信任的:
local all all trust
它仍然会提示输入密码。因此,为了配置-hlocalhost
通过TCP工作,我必须配置host
for localhost地址,如下所示:
host all all 127.0.0.1/32 trust host all all ::1/128 trust
但这对我不起作用。我必须做的是将两者结合起来:
host all all localhost trust
一些额外的读数:
添加回答
举报