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
-查看详细信息#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
评论
如果由于错误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