ChatGPT解决这个技术问题 Extra ChatGPT

psql:致命:用户“postgres”的身份验证失败

我已经在我的 Ubuntu Karmic 机器上安装了 PostgreSQL 和 pgAdminIII。

我能够成功使用 pgAdminIII(即连接/登录),但是当我尝试在命令行上使用相同的用户名/密码登录服务器时(使用 psql),我收到错误:

psql: FATAL:  Ident authentication failed for user "postgres"

有谁现在如何解决这个问题?

这篇 stackoverflow 帖子对我有用:stackoverflow.com/a/18664239/2110769

y
youngrrrr

以下步骤适用于在 Ubuntu 12.04 上全新安装 postgres 9.1。 (也适用于 Ubuntu 14.04 上的 postgres 9.3.9。)

默认情况下,postgres 创建一个名为“postgres”的用户。我们以她的身份登录,并给她一个密码。

$ sudo -u postgres psql
\password
Enter password: ...
...

通过键入 \qctrl+d 注销 psql。然后我们连接为“postgres”。 -h localhost 部分很重要:它告诉 psql 客户端我们希望使用 TCP 连接(配置为使用密码身份验证)进行连接,而不是通过 PEER 连接(确实不在乎密码)。

$ psql -U postgres -h localhost

如果您设置 PGHOST=localhost,则无需每次都指定 -h 选项。这也适用于其他 pg_* 命令,例如 pg_dump
这是在 Debian 上使用 PostgreSQL 启用 Mediawiki 安装所必需的。
2 年后,我也需要在 Mac 上执行此操作。
不好,因为存在安全问题,请参见此处:serverfault.com/questions/110154/…
S
Sam Whited

您是否在 pg_hba.conf 中设置了正确的设置?

请参阅https://ubuntu.com/server/docs/databases-postgresql如何操作。


这对我不起作用。我已经花了好几个小时了!我想要做的就是在我的终端中运行 psql 命令。我需要做什么才能使文件看起来像这样做?
@SeanA 你需要类似 'sudo -u postgres psql'
不要忘记';'在 psql 上的每个语句的末尾。听起来很傻,但它发生了呵呵。
对于那些使用 rails 的人,我必须设置 pg_hba.conf,并将 'ident' 更改为 'password'。将其更改为信任不起作用。
为什么是的,我确实阅读了精美的手册,但它没有一点帮助。它没有提到错误或如何修复它。
J
Jonathan

编辑文件 /etc/postgresql/8.4/main/pg_hba.conf 并将 identpeer 替换为 md5trust,具体取决于您是否希望它在您自己的计算机上要求输入密码。然后重新加载配置文件:

/etc/init.d/postgresql reload

一个命令重启postgresql:/etc/init.d/postgresql restart
当您只需要重新加载时,为什么要重新启动?
在这种情况下:“/etc/init.d/postgresql-8.4 重新加载”
这里的这个对我有用。从 peer 更改为 md5 就足够了。
好的,我是 postgresql 菜鸟,但我必须报告只有 restart 对我有用,而不是 reload--- 更改为 /etc/postgresql/9.5/main/pg_hba.conf(将 peer 更改为 trust)。
D
Derek Mahar

您收到此错误是因为您未通过客户端身份验证。根据错误消息,您可能拥有默认的 postgres 配置,它将所有 PostgreSQL 连接的客户端身份验证方法设置为“IDENT”。

您绝对应该阅读 PostgreSQL manual 中的第 19.1 Client Authentication 部分,以更好地了解可用的身份验证设置(针对 pg_hba.conf 中的每条记录),但这里有相关的代码段可帮助您解决遇到的问题(来自 {4 }):

trust 无条件允许连接。此方法允许任何可以连接到 PostgreSQL 数据库服务器的人以他们希望的任何 PostgreSQL 用户身份登录,而无需密码或任何其他身份验证。有关详细信息,请参阅第 19.3.1 节。 reject 无条件拒绝连接。这对于从组中“过滤掉”某些主机很有用,例如,拒绝行可以阻止特定主机连接,而后面的行允许特定网络中的其余主机连接。 md5 要求客户端提供双 MD5 哈希密码进行身份验证。有关详细信息,请参阅第 19.3.2 节。密码 要求客户端提供未加密的密码进行身份验证。由于密码是通过网络以明文形式发送的,因此不应在不受信任的网络上使用。有关详细信息,请参阅第 19.3.2 节。 gss 使用 GSSAPI 对用户进行身份验证。这仅适用于 TCP/IP 连接。有关详细信息,请参阅第 19.3.3 节。 sspi 使用 SSPI 对用户进行身份验证。这仅在 Windows 上可用。有关详细信息,请参阅第 19.3.4 节。 ident 通过联系客户端上的 ident 服务器获取客户端的操作系统用户名,并检查是否与请求的数据库用户名匹配。 Ident 身份验证只能用于 TCP/IP 连接。当为本地连接指定时,将使用对等身份验证。有关详细信息,请参阅第 19.3.5 节。 peer 从操作系统获取客户端的操作系统用户名,检查是否匹配请求的数据库用户名。这仅适用于本地连接。有关详细信息,请参阅第 19.3.6 节。 ldap 使用 LDAP 服务器进行身份验证。有关详细信息,请参阅第 19.3.7 节。 radius 使用 RADIUS 服务器进行身份验证。有关详细信息,请参阅第 19.3.8 节。 cert 使用 SSL 客户端证书进行身份验证。有关详细信息,请参阅第 19.3.9 节。 pam 使用操作系统提供的 Pluggable Authentication Modules (PAM) 服务进行身份验证。有关详细信息,请参阅第 19.3.10 节。

所以...要解决您遇到的问题,您可以执行以下操作之一:

将您在 pg_hba.conf 文件中定义的身份验证方法更改为您在其中定义的本地连接记录的信任、md5 或密码(取决于您的安全性和简单性需求)。更新 pg_ident.conf 以将您的操作系统用户映射到 PostgreSQL 用户,并根据您的需要授予他们相应的访问权限。保留 IDENT 设置并在数据库中为您要授予访问权限的每个操作系统用户创建用户。如果用户已经通过操作系统的身份验证并登录,PostgreSQL 将不需要进一步的身份验证,并将根据在数据库中分配给该用户的任何权限(角色)授予该用户的访问权限。这是默认配置。

注意:pg_hba.confpg_ident.conf 的位置取决于操作系统。


对我来说,这是最好的答案。当您了解所有这些选项时,您可以轻松地调整 conf.尤其是当你在开发机器上时,你可以简单地为所有条目设置“ident”以避免浪费你的时间。谢谢
这对我也很有帮助。就我而言,pg_hba.conf 文件设置为对等,我将其更改为密码。请注意,从香草安装中,我还必须为 postgres 用户设置密码,sudo su - postgres psql, \password 设置密码。然后使用用户名 postgres 和您设置的密码从 pdgadmin3 启动默认连接。
该文件在哪里找到?当然,您可能需要列出一个列表,因为版本之间似乎没有一致性。我想我会在 '/' 上运行 find 。
在 Ubuntu-16.04 上是 /etc/postgresql/9.6/main/pg_hba.conf
作为 psql 的新手,这是一个巨大的帮助,应该是公认的答案,因为它迎合了各种身份验证方法
b
boulder_ruby

只需添加 -h localhost 位即可工作


我们知道为什么这会解决它吗?
postgresql 的默认值设置不合理。他们现在可能已经修好了,我不知道。显然默认 url 应该是 this_computer = 'http://localhost'
如此充分地使用“pg_dump -U postgres test -f test_1.sql -h localhost”命令对我有用
如果您不包含主机名(通过 -h ... 选项),那么 psql 默认会尝试通过 Unix 域套接字连接,在这种情况下 psql(或者可能是 PostgreSQL 集群本身)会查询您的操作系统为您的用户名使用对等身份验证,即确认您的用户名与您指定的 PostgreSQL 用户(角色)匹配(很可能不匹配)。当您指定主机名时,psql 将使用 TCP/IP 连接到集群。
E
Ethan Brown

如果上述方法都不适合您:我已经安装了很多 Postgres,但今天在 RedHat 6.5 系统(安装 Postgres 9.3)上感到困惑。 Aron 上面显示的我的典型 hba.conf 配置不起作用。原来我的系统使用的是 IPV6,而忽略了 IPV4 配置。添加行:

host    all             all             ::1/128                 password

允许我成功登录。


谢谢伊桑。我正在运行 Fedora 20,我遇到了与 OP 相同的问题。将 IPV4 和 IPV6 更改为密码后。连接成功。
你很受欢迎。当遇到编程或系统问题时,我多次从其他帖子中受益。很高兴我能回馈一点。
这在 Fedora 32 上救了我的命!
D
Dirk

您可以设置环境变量 PGHOST=localhost

$ psql -U db_user db_name
psql: FATAL:  Peer authentication failed for user "db_user"

$ export PGHOST=localhost
$ psql -U db_user db_name

Password for user mfonline:

K
Kenny Evitt

嗯...

如果您可以使用 pgAdminIII 中的用户名和密码进行连接,但无法使用 psql 进行连接,那么这两个程序可能以不同的方式连接到数据库。

[如果您要连接到不同的数据库,请先尝试连接到同一个数据库。见下文。]

PostgreSQL: Documentation: 9.3: psql

如果省略主机名,psql 将通过 Unix 域套接字连接到本地主机上的服务器,或通过 TCP/IP 连接到没有 Unix 域套接字的机器上的 localhost。

如果您没有运行 psql ... -h host_name ... 之类的东西,而您运行的是 Ubuntu,则 psql 应该通过 Unix 域套接字连接,因此 PostgreSQL 可能未配置为允许 < em>postgres 用户。

您可以通过运行来测试它:

sudo -u postgres psql

如果上述方法有效,您的服务器可能已配置为使用对等身份验证来进行 postgres 用户的本地连接,即向操作系统询问您的用户名以确认您是 postgres。

所以它可能是你的 pg_hba.conf 文件

文件的完整路径类似于 /etc/postgresql/9.3/main/pg_hba.conf。您可以通过例如 sudo cat /etc/postgresql/9.3/main/pg_hba.conf | more 查看它。

如果您在 psql 命令中省略了主机名,那么将以下条目添加到 pg_hba.conf 文件中应该能够连接:

# Connection type   Database   User       IP addresses   Method
local               all        postgres                  md5

[pg_hba.conf 文件中的注释行以 # 开头。]

如果您正在psql 命令中包含主机名,请改为添加以下条目:

# Connection type   Database   User       IP addresses   Method
host                all        postgres   127.0.0.1/32   md5

您需要先输入该条目,然后才能通过 psql 为您的连接匹配任何其他条目。如果对放置位置有疑问,只需将其放在第一个未注释行之前。

更多关于 pg_hba.conf

来自 PostgreSQL: Documentation: 9.3: The pg_hba.conf File [我的粗体强调]:

具有匹配连接类型、客户端地址、请求的数据库和用户名的第一条记录用于执行身份验证。没有“fall-through”或“backup”:如果选择了一条记录并且认证失败,则不考虑后续记录。如果没有记录匹配,则拒绝访问。

请注意,身份验证方法上的记录不匹配。因此,如果您的 pg_hba.conf 文件包含以下条目:

# Connection type   Database   User       IP addresses   Method
local               all        postgres                  peer

然后您将无法通过以下方式连接:

psql -u postgres

除非这些条目之一位于前一个条目上方的 pg_hba.conf 文件中:

# Connection type   Database   User       IP addresses   Method
local               all        postgres                  md5
local               all        postgres                  password   # Unencrypted!
local               all        all                       md5
local               all        all                       password   # Unencrypted!

游戏迟到了,但是,说真的,感谢您努力正确解释事情,以便我理解!
我在启动 docker 容器时遇到了这个问题,我的 ubuntu 系统上没有 pg_hba.conf 文件,但它可能在 docker 映像中?那为什么它给我这个错误?
@Zaffer 我不确定你在问什么,但它似乎与这个问题必然无关。我也不确定 SO(此站点)是否是您在任何潜在问题上获得帮助的好地方。如果您想更详细地讨论您的问题,我创建了 a chat room 并将您添加到其中。
C
Community

在以上所有答案中,对我没有任何帮助。我不得不手动更改数据库中的用户密码,它突然起作用了。

psql -U postgres -d postgres -c "alter user produser with password 'produser';"

我使用了以下设置:

pg_hba.conf

local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            password  
# IPv6 local connections:
host    all             all             ::1/128                 password

最终连接成功,如下命令:

psql -U produser -d dbname -h localhost -W 

约瑟夫,这对我有帮助。特别是最后的连接命令可以帮助我测试它。另外,如果有人想知道,我会添加 Postgresql 服务的重新启动(但我知道这是隐含的)。非常欣赏!
A
Archit Verma

对于 fedora26 和 postgres9.6

首先,以root用户登录,然后通过以下命令进入psql

$ su postgres  

然后

$ psql

psql 中找到 hba_file ==> 的位置表示pg_hba.conf

postgres=# show hba_file ; 
 hba_file  
--------------------------------------   
 /etc/postgresql/9.6/main/pg_hba.conf  
(1 row)  

在文件 pg_hba.conf 中更改用户对此的访问权限

host all all 127.0.0.1/32 md5

V
VanThaoNguyen

就我而言,这里的解决方案:(对于有关人员)登录到 postgres:

sudo -i -u postgres
psql
ALTER USER postgres WITH PASSWORD 'postgres'; # type your password here

问候


D
Dustin Kirkland

我发现我必须安装一个身份服务器,它侦听端口 113。

sudo apt-get install pidentd
sudo service postgresql restart

然后 ident 工作。


S
Suneel Kumar

问题仍然是您的 pg_hba.conf 文件。这一行:你可以在 /etc/postgres/varion/main 中找到这个文件

local   all             postgres                                peer
Should be

local   all             postgres                                md5

这些是根据官方 PostgreSQL 文档关于身份验证方法的两个选项的简要描述。

对等身份验证

对等身份验证方法通过从内核获取客户端的操作系统用户名并将其用作允许的数据库用户名(带有可选的用户名映射)来工作。此方法仅在本地连接上受支持。

密码认证

基于密码的身份验证方法是 md5 和密码。除了通过连接发送密码的方式(即分别为 MD5 散列和明文)之外,这些方法的操作类似。

如果您完全担心密码“嗅探”攻击,那么首选 md5。如果可能,应始终避免使用纯密码。但是,md5 不能与 db_user_namespace 功能一起使用。如果连接受 SSL 加密保护,则可以安全地使用密码(但如果依赖于使用 SSL,则 SSL 证书身份验证可能是更好的选择)。

更改此文件后,不要忘记重新启动 PostgreSQL 服务器。如果您使用的是 Linux,那将是 sudo service postgresql restart.


A
Aaron Lelevier

我在 bash shell 中的 Mac OSX 上的 PostgreSQL 9.3 上的解决方案是使用 sudo 进入数据文件夹,然后将必要的行附加到 pg_hba.conf 文件以允许所有用户受信任并能够登录.这就是我所做的:

# in bash_profile edit PGDATA environmental variable
open ~/.bash_profile

# append this line to bash_profile
export PGDATA="/Library/PostgreSQL/9.3/data"

# reload bash_profile
source ~/.bash_profile

# open pg_hba.conf in vim
sudo vi /Library/PostgreSQL/9.3/data/pg_hba.conf

# append these two lines to the end of the pg_hba.conf file
local   all   all                  trust
host    all   all   127.0.0.1/32   trust

# can now login as user in bash
psql -d <db_name> -U <user_name> -W

这对于开发服务器来说很好,但我不建议将其用于生产环境,因为您不再需要密码来使用这些设置连接到数据库。
J
Jeremy Whiting

我花了更多时间来解决这个我愿意承认的错误。

我认为 pg_hba.conf 中的身份验证配置顺序与您的情况相关。默认配置文件在 vanilla 安装中包含几行。这些默认值可以匹配您的身份验证尝试的条件,从而导致身份验证失败。无论在 .conf 文件末尾添加的其他配置如何,它都会失败。

要检查使用哪一行配置,请务必查看默认日志文件中的消息。你可能会看到这样的东西

LOG:  could not connect to Ident server at address "127.0.0.1", port 113: Connection refused
FATAL:  Ident authentication failed for user "acme" 
DETAIL:  Connection matched pg_hba.conf line 82: "host     all             all             127.0.0.1/32            ident"

事实证明,这个默认行导致了拒绝。

host    all             all             127.0.0.1/32            ident

尝试将其注释掉。


C
Community

如果您已完成所有这些操作但仍然无法正常工作,请检查该用户的到期时间:

Postgres password authentication fails


T
TMa

我有类似的问题,我在删除所有 ident 方法时在 pg_hba.conf 中修复了它,即使是 IP6 地址(尽管我的机器上只有 IP4)。

host all all 127.0.0.1/32 password
host all all ::1/128 password
#for pgAdmin running at local network
host all all 192.168.0.0/24 md5

n
ntg

解决这个问题的一个技巧是编辑 pg_hba.conf

sudo vi /etc/postgresql/9.3/main/pg_hba.conf

暂时

# Database administrative login by Unix domain socket
local   all             postgres                                   trust

至此,您就完成了。为了安全起见,然后去

sudo -u postgres psql template1
ALTER USER postgres with encrypted password 'your_password';

然后返回并将 pg_hba.conf 设置回

# Database administrative login by Unix domain socket
local   all             postgres                                   md5

J
Jaswinder

如果您在 CentOS 上使用它,您可能需要在完成上述解决方案后重新加载 postgres:

systemctl restart postgresql-9.3.service

现在只是 postgresql
@NeilChowdhury postgresql 服务至少在 linux 系统中仍然有服务名称的版本。运行此命令以查看 systemctl status | grep postgres
A
Ajay Tom George

https://i.stack.imgur.com/6wPA8.png

CREATE USER admin WITH PASSWORD 'secret'

然后在 cmd

psql "dbname=Main_db host=127.0.0.1 user=admin password=secret port=5432

其中 dbname 是您在 postgresql 中的数据库

https://i.stack.imgur.com/mKoYq.png


S
Sameer Kumar Choudhary

它与PostgreSQL安装的配置问题有关:

在下面提到的 conf 文件中配置 # TYPE DATABASE USER ADDRESS METHOD 部分

查找并编辑 /var/lib/pgsql/10/data/pg_hba.conf 或根据您的文件位置更新方法(md5)。如果您的配置不存在,则通过如下比较更新文件中的条目:

# TYPE  DATABASE        USER            ADDRESS                 METHOD
# "local" is for Unix domain socket connections only
local   all             all                                     trust
local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
host    all             all             0.0.0.0/0            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5

在下面提到的 conf 文件中配置 CONNECTIONS AND AUTHENTICATION 部分

查找和编辑 /var/lib/pgsql/10/data/postgresql.conf 或根据您的文件位置更新侦听地址和端口

listen_addresses = '*' // # what IP address(es) to listen on;
                                    # comma-separated list of addresses;
                                    # defaults to 'localhost'; use '*' for all
port = 5432 // Set port as 5432

重启你的 PostgreSQL:

sudo systemctl restart postgresql-10 # Update service name based on your installation

D
Daniel

遵循此操作后我遇到了同样的问题:PostgreSQL setup for Rails development in Ubuntu 12.04

我尝试了其他答案,但我所要做的就是:“config/database.yml”

development:
  adapter: postgresql
  encoding: unicode
  database: (appname)_development
  pool: 5
  username: (username you granted appname database priviledges to)
  password:

D
Dharman

我必须重新安装 pdAdmin 才能解决此问题

brew cask reinstall pgadmin4

T
Tara Prasad Gurung

我通过 terraform 在 GCP SQL 中提供了用户名和密码,问题是密码没有通过 terraform 正确设置,所以虽然不是正确的修复,但只是为了找出确切的原因。

我从 GCP 控制台更改了用户的密码并且有效。


D
Dan

这对我有用:http://tecadmin.net/fatal-ident-authentication-failed-for-user-postgres/#

local   all             postgres                                trust
local   all             myapp_usr                               trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
#host    all             all             ::1/128                 trust

这允许来自本地主机的任何人以任何用户身份登录。链接中的任何地方都没有提到此行为。是的,debian 信息页面包含相同的内容。