我知道,安装后,PostgreSQL 的 db 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
相应地更新文件)
我的问题是:当 user 不需要密码时,用于恢复到以前情况的 SQL 是什么postgres
。
一般来说,我怎样才能删除任何角色的密码要求?我不是在问如何更改密码,而是在问如何删除密码要求(表中的空passwd
列pg_shadow
)。
pg_shadow
是否需要密码与是否为用户实际定义了密码无关。是的,我知道,这很奇怪。pg_hba.conf
控制身份验证方法。如果要请求密码,请使用md5
身份验证。如果您想允许任何人无需密码即可登录,请使用trust
. 如果您想在操作系统中要求与 PostgreSQL 中相同的用户名,请使用peer
(UNIX,仅用于本地连接) 或sspi
(Windows)。如果设置了密码,但
pg_hba.conf
没有告诉 PostgreSQL 要求它,则密码将被忽略。如果
pg_hba.conf
告诉 PostgreSQL 要求输入密码但没有设置密码,那么无论提供什么密码,所有登录尝试都将失败。postgres 用户默认没有密码。要删除用户密码(在本例中为 postgres 用户/角色):
我们还需要将身份验证设置为
trust
查看详细pg_hba.conf
信息截至 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 中适合的第一行被采用,所有其他行都被忽略。所以只使用(默认)第一行就足够了
此行与到 PostgreSQL 服务器的(unix-)套接字连接(来自 psql)有关。 未提及的“问题”是 psql 程序默认使用到 localhost 的 TCP 连接(偶数)。
为了证明这一点,只需注释掉 pg_hba.conf 中的 ...127.0.0.1/32.... 和 ...::1/128... 行,并使 PostgreSQL 服务器重新读取修改后的行。
怎么做,来自文档:
你也可能“粗暴地”发出
如果 db-restart 无关紧要。
然后,尝试使用 psql 程序连接会出现一条错误消息,指示 psql 尝试通过 TCP 连接。
一旦使用 psql 通过 unix-socket 连接,pg_hba.conf 中的第一行就可以工作,并且(超级)用户 postgres 可以将他的密码设置为 null 或任何字符串,并且仍然可以连接而无需询问密码。
通过套接字连接:
或者
并在控制台会话中进一步使用
看:
特别是对于“-h”和“-p”选项。
来自我的控制台的引用,不需要也不需要密码(sys lang 是德语):
附录:
@a_horse_with_no_name 发表了一条引用 man psql 的评论:
谢谢你的提示,这是正确的,但后面直接是相关的
这将导致在标准端口 5432 以外的其他端口上运行 db-server 时需要指定主机或套接字目录(-h 参数)。
我必须承认我在上面的“来自我的控制台的引用”中作弊,因为“主机名”不是我计算机的真实主机名,并且 5432 不是我的 PostgreSQL 13 服务的端口。这样做是出于隐私和简单的原因。事实上,我有一个 PostgreSQL 9.6 在端口 5432 上运行,而 13 版本同时在另一个端口上运行。
对于测试,我在 9.6 和 13 的 pg_hba.conf 中禁用了 ...127.0.0.1/32.... 和 ...::1/128... 行,以便只能进行 sockect 连接。
无论如何,在@a_horse_with_no_name 的评论之后,一个简单的
应该通过套接字连接到我的 PostgreSQL 9.6 服务器。但事实并非如此!当我发布时它甚至没有
如果服务器版本 13 被禁用,则结果相同,因此标准端口 5432 上只有一个 db-server (9.6) 正在运行。
当我尝试时也没有
运行服务器 13 版本。
在所有这些情况下,psql 都尝试不通过套接字连接,而是通过 TCP 连接。我监督了什么?至少我的解决方案,指定套接字目录,应该可以工作。
在提供 unix-sockets 的 Ubuntu 18.04 上,似乎需要 -h 参数及其参数,指定端口或套接字目录。
顺便说一句,PGHOST 和 PGPORT 环境变量都没有设置,而是未定义。
如果有人知道更好,请发表评论。
如果您在连接时不告诉 PSQL 使用什么用户名或数据库,它会使用系统
$USER
来识别登录用户并使用该名称附加到数据库。它需要用户和数据库才能正确建立连接。这超出了 PostgreSQL 文档的第 1.4 节。如果没有具有该名称的数据库可以连接到它,AFAIK 将会失败(当我以这种方式测试它时它会失败)。如果存在名称匹配的数据库,
$USER
那么它将使用“psql”连接到该数据库,并且没有指定数据库(我再次测试以确定)。