我了解到,安装后PostgreSQL的数据库root用户(postgres)没有密码:

postgres=# select usename, passwd is null from pg_shadow;
 usename  | ?column? 
----------+----------
 postgres | t
(1 row)


...,建议使用以下命令进行设置:

alter role postgres password '<<very-secret>>';


(然后相应地更新pg_hba.conf文件)

我的问题是:用于恢复到先前情况的SQL是什么?当用户postgres不需要密码时。

通常,如何删除任何角色的密码要求?我不是在问如何更改密码,而是要删除密码要求(表passwd中的空pg_shadow列)。

#1 楼

是否需要密码与pg_shadow无关,是否为用户实际定义了密码。是的,我知道,这很奇怪。

pg_hba.conf控制身份验证方法。如果要请求密码,请使用md5身份验证。如果您想允许没有密码的任何人登录,请使用trust。如果要在操作系统中要求使用与PostgreSQL中相同的用户名,请使用peer(UNIX,仅用于本地连接)或sspi(Windows)。

如果设置了密码,但pg_hba.conf没有设置密码t告诉PostgreSQL要求密码,密码将被忽略。

如果pg_hba.conf告诉PostgreSQL要求输入密码但未设置密码,则无论提供什么密码,所有登录尝试都将失败。 />

#2 楼

默认情况下,postgres用户没有密码。要删除用户密码(在这种情况下为postgres用户/角色):

alter role postgres password null;


我们还需要在trust中将身份验证设置为pg_hba.conf-查看详细信息

评论


如果由于错误psql:fe_sendauth:没有提供密码而无法访问,则编辑C:\ Program Files \ PostgreSQL \ 10 \ data \ pg_hba.conf并用IPv4下的127.0.0.1/32旁边的信任替换md5。本地连接,在IPv6本地连接下位于:: 1/128旁边

– Marco Lackovic
19年8月8日在8:27



这很危险。请考虑在答案中加入警告,警告用户可能会被锁定,并可能提出解决方案。

–滞后反射
20 Jun 30'3:51



#3 楼

截至2020-11-22,在ubuntu 18上使用PostgreSQL 13时,我偶然发现了@lalligood(和@thouliha-同时被删除)给出的答案,将自己的用户postgres锁定为无密码。
以下假定登录是在运行PostgreSQL服务器的计算机上使用psql(wrapper-)程序完成的。
阅读PostgreSQL 13.0文档的第20章(客户端身份验证)后,我想知道为什么要更改... 127.0 .0.1 / 32 ....和... :: 1/128 ...行以信任身份验证。文档说得很清楚:pg_hba.conf中适合的第一行被选中,所有其他行均被忽略。因此,仅使用(默认)第一行就足够了。
local   all     postgres    peer

此行与(从psql到PostgreSQL服务器的)(unix-)套接字连接有关。
未提及“问题”是psql程序默认使用与本地主机的TCP连接(甚至)。
为了证明这一点,只需注释掉... 127.0.0.1/32 ....和... :: 1/128 ... pg_hba.conf中的行,并使PostgreSQL服务器重新读取已修改的行。
如何操作,从docs:

如果在活动系统上编辑文件,您将需要发信号通知
postmaster(使用pg_ctl重新加载,调用SQL函数
您也可能“蛮力”发出问题
 systemctl restart postgresql 

如果重新启动数据库没有关系。
然后,尝试使用psql程序进行连接将出现错误消息,指示psql试图通过TCP连接。
一旦使用psql通过unix-socket连接,pg_hba.conf中的第一行就可以d(超级)用户postgres可以将其密码设置为null或任何字符串,并且仍然可以在不要求输入密码的情况下进行连接。
通过套接字连接:
psql -h /var/run/postgresql -p 5432
export PGPORT=5432; psql -h /var/run/postgresql

并进一步在控制台会话中使用
psql -h /var/run/postgresql

,请参见:
man psql

,尤其是对于“ -h”和“ -p”选项。
从我的控制台引证,不需要密码也不问(sys lang是德语):

postgres @ hostname:/ tmp $ psql -h / var / run / postgresql -p 5432
psql (13.1(Ubuntu 13.1-1.pgdg18.04 + 1))
Geben Sie»帮助«希尔费·艾因。 postgres =#alter role postgres密码为null;
ALTER ROLE
postgres =#\ q
postgres @ hostname:/ tmp $ psql -h / var / run / postgresql -p 5432
psql(13.1(Ubuntu 13.1-1.pgdg18.04 + 1))
Geben Sie»帮助«Hilfe ein。
postgres =#更改角色postgres密码'secret';
ALTER ROLE
postgres =#\ q
postgres @ hostname: / tmp $ psql -h / var / run / postgresql -p 5432
psql(13.1(Ubuntu 13.1-1.pgdg18.04 + 1))
Geben Sie»帮助«希尔费·艾因。

附录:
@a_horse_with_no_name引用了man psql的评论:

如果省略主机名,则psql将通过Unix域套接字进行连接
到本地主机上的服务器,或通过TCP / IP到没有Unix域套接字的计算机上的localhost。
谢谢您的提示,这是正确的,但是后面紧随其后的是

。默认端口号在编译时确定。由于
数据库服务器使用相同的默认值,因此在大多数情况下不必指定
端口。

这应导致需要指定主机或套接字目录(-h参数)在非标准端口5432上运行db-server时。
我必须承认我在上面的“从我的控制台引用”中作弊,因为“主机名”不是我计算机的真实主机名。和5432不是我的PostgreSQL 13服务的端口。这样做是出于隐私和简单的原因。实际上,我有一个PostgreSQL 9.6在5432端口上运行,而13版本同时在另一个端口上运行。
为了进行测试,我禁用了... 127.0.0.1/32 ....和...: :1/128 ... 9.6和13的pg_hba.conf中的行,因此只能进行sockect连接。
无论如何,在@a_horse_with_no_name的注释之后,简单地
psql

应通过套接字连接到我的PostgreSQL 9.6服务器。但事实并非如此!当我发出
psql -p 5432

时甚至没有,如果禁用服务器版本13,以至于标准端口5432上只有一个数据库服务器(9.6)正在运行,则结果相同。
也没有当我尝试使用正在运行的服务器13版本时尝试
psql -p [port of my version 13 db-server]


在所有情况下,psql尝试不通过套接字而是通过TCP进行连接。我监督过什么吗?至少我的解决方案(指定套接字目录)仍然可以正常工作。
在提供unix-sockets的Ubuntu 18.04上,似乎需要指定端口或套接字目录的-h参数及其参数。 >顺便说一下,既未设置PGHOST环境变量,也未设置PGPORT环境变量,但未定义。
如果有人知道的话,请发表评论。

评论


“默认情况下,psql程序使用与本地主机的TCP连接(甚至)”(我认为这不是真的)。在Linux上,psql默认使用套接字连接。引用手册中的“如果省略主机名,则psql将通过Unix域套接字连接到本地主机上的服务器,或者通过TCP / IP连接到没有Unix域套接字的计算机上的localhost。”也许您定义了环境变量PGHOST?

– a_horse_with_no_name
20 Nov 24'15:38