psql 不会登录,而 pgAdmin 让我成功登录?命令错误?

Posted

技术标签:

【中文标题】psql 不会登录,而 pgAdmin 让我成功登录?命令错误?【英文标题】:psql won't login, while pgAdmin logs me in successfully? Wrong command? 【发布时间】:2015-09-21 12:13:24 【问题描述】:

我有一台远程机器,我正在尝试使用以下命令登录到 postgres 数据库(通过ssh 以 Linux root 用户身份运行,即在该机器上本地运行):

# psql -d mydatabase -U postgres -W
Password for user postgres: <here goes my password>
psql: FATAL:  Peer authentication failed for user "postgres"

由于某种原因失败了(尝试了大约 5 次)。

但是当我使用 pgAdmin(即远程)以相同的角色(postgres)和相同的密码登录到同一个数据库时,它每次都成功登录。

我使用的psql 命令有什么问题?如果正确,您能否提出任何故障排除步骤?

编辑:所以问题是在pg_hba.conf 中,远程和本地连接的处理方式不同。远程配置正确。问题是为什么当地人不工作。

对于本地人,我在pg_hba.conf:

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5

我是否理解正确,对于localhost 连接,它首先尝试对等身份验证,如果失败,它不会尝试md5 并且只是返回错误?

【问题讨论】:

PgAdmin 将使用 tcp/ip 到 localhost (127.0.0.1),psql 将使用 unix 套接字。查看pg_hba.conf和手册的客户端认证章节。 您可以通过指定主机名来强制 psql 使用 inet 套接字:psql -U postgres -h 127.0.0.1 mydb 【参考方案1】:

默认情况下,psql 正在尝试通过对等方登录。这意味着,您必须在本地计算机上以 postgres 身份登录。您可以强制 psql 使用 TCP/IP,您需要 tpo 指定一个主机,可以是 localhost,所以调用可能如下所示:

psql -U postgres -h 127.0.0.1

另一种方法是调整您的设置。我看到了两种更改当前本地设置的方法:

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5

1) 通过设置 line 允许所有用户从 localhost 无需密码登录

local   all             all                                     trust

这是非常危险的,恕我直言,不应该这样做。

2) 另一种方法是创建一个与您的系统登录用户名相同的数据库用户并授予此帐户的所有权限

当然,在这种情况下我通常会这样做:在 postgres 用户的上下文中运行 psql,例如通过 sudo -u postgres psql 或使用 su -u postgres -c "p​​sql ..."

【讨论】:

以上是关于psql 不会登录,而 pgAdmin 让我成功登录?命令错误?的主要内容,如果未能解决你的问题,请参考以下文章

无法在 pgAdmin 4 上查询数据,但可以使用 psql 和 Python

PgAdmin IV中的PSQL控制台

我将我的 RDS (psql) 数据库设置为不可公开访问,现在我无法使用 pgAdmin 连接到我的数据库。我现在如何连接到它?

pgAdmin 4 始终在浏览器中打开,而不是作为独立的桌面应用程序

psql:尽管存在关系,但没有找到关系

Pgadmin4 不会显示在 Windows 10 系统托盘上