出现错误:尝试让 pgsql 与 rails 一起工作时,用户“postgres”的对等身份验证失败

Getting error: Peer authentication failed for user "postgres", when trying to get pgsql working with rails

提问人:orderof1 提问时间:9/7/2013 最后编辑:Joel Ellisorderof1 更新时间:7/30/2023 访问量:1143472

问:

我收到错误:

FATAL: Peer authentication failed for user "postgres"

当我尝试使 postgres 与 Rails 一起使用时。

这是我的 pg_hba.conf我的database.yml完整跟踪的转储

我在 pg_hba 年将身份验证更改为 md5 并尝试了不同的东西,但似乎都不起作用。

我还尝试按照 Rails 3.2 创建一个新用户和数据库,致命:用户的对等身份验证失败 (PG::Error)

但是它们不会出现在 pgadmin 上,甚至在我运行时也不会出现。sudo -u postgres psql -l

知道我哪里出错了吗?

Ruby-on-Rails PostgreSQL

评论

1赞 MrYoshiji 9/7/2013
1):确保你已经创建了一个名为“postgres”的用户,并且对你的数据库有权限 2):确保他有密码 3):确保你的配置/database.yml包含权限凭据(用户名+密码)
2赞 Artem.Borysov 7/28/2015
需要将 Everyplace 对等点和缩进设置为 MD5
37赞 uvsmtid 8/26/2015
另请参阅此答案 - 连接可能会失败,但成功。localhost127.0.0.1
14赞 Mihail Velikov 3/16/2016
就我而言,我需要添加文件。host: localhostdatabase.yml
0赞 Sudip Bhandari 4/25/2017
这个链接帮助我 suite.opengeo.org/docs/latest/dataadmin/pgGettingStarted/...
2赞 Collin 9/6/2019
我通过附加我认为是默认值来修复此错误--host=localhost

答:

1515赞 Marcelo De Polli 9/7/2013 #1

问题仍然出在您的文件*上。pg_hba.conf

这一行:

local   all             postgres                                peer

应该是:

local   all             postgres                                md5

更改此文件后,不要忘记重新启动 PostgreSQL 服务器。如果您使用的是 Linux,那将是(在较旧的系统上:)。sudo systemctl restart postgresqlsudo service postgresql restart


定位hba.conf

请注意,此文件的位置不是很一致。

您可以使用或要求 PostgreSQL 来发现文件位置。locate pg_hba.confSHOW hba_file;

通常的位置是 和 。/etc/postgresql/[version]/main/pg_hba.conf/var/lib/pgsql/data/pg_hba.conf


这些是根据官方 PostgreSQL 文档中关于身份验证方法的 vs 选项的简要说明。peermd5

对等身份验证

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

密码身份验证

基于密码的身份验证方法是 md5 和 password。这些 方法的操作方式与密码发送方式类似 跨连接,分别是 MD5 哈希和明文。

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

评论

77赞 funkotron 10/28/2013
更改此设置后,您需要重新加载 postgresql 服务/etc/init.d/postgresql reload
88赞 Doug 1/31/2014
把它放在这里,因为我总是忘记这个文件在哪里/etc/postgresql/9.1/main/pg_hba.conf
17赞 Marnen Laibow-Koser 3/22/2014
@funkotron至少在我的 ElementaryOS (Ubuntu) 安装上也可以。sudo service postgreql restart
19赞 Dennis 3/28/2014
回答我自己的问题:“对等”身份验证意味着 postgres 要求操作系统提供您的登录名并将其用于身份验证,因此操作系统和 postgres 上的用户必须相同。“md5”使用加密的密码身份验证。
13赞 Victor Ribeiro 6/14/2015
我理解这种变化。但为什么这不是默认行为呢?使用 md5 有什么缺点吗?
12赞 nirvanastack 10/14/2013 #2

我有同样的问题。

depa 的解决方案是绝对正确的。

只需确保您已将用户配置为使用 PostgreSQL。

检查文件:

$ ls /etc/postgresql/9.1/main/pg_hba.conf -l

此文件的权限应授予已向其注册 psql 的用户。

进一步。如果你到现在还好..

按照@depa的指示进行更新。

$ sudo nano /etc/postgresql/9.1/main/pg_hba.conf

,然后进行更改。

评论

0赞 Sun 6/16/2018
我面临同样的问题。但是我不知道我应该需要什么权限。你可以帮我吗。我得到的“ls”命令的输出是-rw-r----- 1 postgres postgres 4640 Jun 16 09:59 /etc/postgresql/9.5/main/pg_hba.conf
672赞 Arivarasan L 11/4/2014 #3

安装Postgresql后,我执行了以下步骤。

  1. 打开文件 。对于 Ubuntu,例如使用并更改文件底部的这一行,它应该是设置的第一行:pg_hba.conf/etc/postgresql/13/main$ sudo nano pg_hba.conf

    local   all             postgres                                peer

    local   all             postgres                                trust

    旁注:如果您也希望能够与其他用户联系,您还需要更改:

    local   all             all                                peer

    local   all             all                                md5

    如果您使用了 nano 编辑器,请使用双 , , 退出以保存配置文件。EscapexyEnter

  2. 重新启动服务器

     $ sudo service postgresql restart
    

    输出:* Restarting PostgreSQL 13 database server

  3. 登录 psql 并设置密码

     $ psql -U postgres
     db> ALTER USER postgres with password 'your-pass';
    

    输出:ALTER ROLE

    旁注:如果您有其他用户,他们也需要密码:

     db> ALTER USER my_user with password 'your-pass';
    

    然后输入:

     exit
    
  4. 最后将pg_hba.conf

    local   all             postgres                                trust

    local   all             postgres                                md5
  5. 再次重新启动服务器

     $ sudo service postgresql restart
    

    输出:* Restarting PostgreSQL 13 database server

  6. 使用 postgres 用户登录 psql

    重新启动 postgresql 服务器后,postgres 用户接受您选择的密码:

     psql -U postgres
    

    输出:
    Password for user postgres:

    psql (13.4 (Ubuntu 13.4-1.pgdg20.04+1))

    Type "help" for help.

    你在psql中:

    postgres=#

    旁注:如果您添加了用户和密码,现在也同样适用:my_user

     psql -d YOUR_DB_NAME -U my_user
    

    这将要求您输入新密码。my_user

身份验证方法详细信息:

信任 - 任何可以连接到服务器的人都有权访问数据库

对等 - 使用客户端的操作系统用户名作为数据库用户名来访问它。

MD5 - 基于密码的身份验证

如需进一步参考,请在此处查看

评论

35赞 La-comadreja 11/19/2014
将方法更改为“信任”对我有用。+1 用于身份验证方法详细信息的说明。
8赞 xji 11/22/2014
在OS X自制软件上,默认值是trust,而在Ubuntu上,默认设置为“peer”,这导致我和我的同事的设置之间存在差异。我们把他改成了MD5,这没有帮助,所以“信任”是真正的答案(我们只是在做开发测试)。应该得到更多的赞成票。
2赞 Artem.Borysov 7/28/2015
您也可以从一开始就设置 MD5 Everyplace
2赞 anipard 9/17/2016
这种方式对我有用,首先使用方法 md5 不是。
0赞 Peter Krauss 8/27/2017
需要使用相同的密码吗?sudo passwd postgres
347赞 StylusEater 2/28/2015 #4

如果通过 localhost (127.0.0.1) 进行连接,则不会遇到该特定问题。我不会对 pg_hba.conf 进行太多处理,但我会调整您的连接字符串:

psql -U someuser -h 127.0.0.1 database

其中 someuser 是您连接时使用的用户,database 是您的用户有权连接到的数据库。

以下是我在 Debian 上设置 postgres 所做的工作:

http://www.postgresql.org/download/linux/debian/  (Wheezy 7.x)

as root …

    root@www0:~# echo "deb http://apt.postgresql.org/pub/repos/apt/ wheezy-pgdg main" >> /etc/apt/sources.list

    root@www0:~# wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -

    root@www0:~# apt-get update

    root@www0:~# apt-get install postgresql-9.4        

    root@www0:~# su - postgres 

    postgres@www0:~$ createuser --interactive -P someuser
    Enter password for new role:
    Enter it again:
    Shall the new role be a superuser? (y/n) n
    Shall the new role be allowed to create databases? (y/n) y
    Shall the new role be allowed to create more new roles? (y/n) n

    postgres@www0:~$ createdb -O someuser database

    postgres@www0:~$ psql -U someuser -h 127.0.0.1 database

享受!

评论

41赞 jeteon 1/31/2016
我认为这是最好的解决方案,因为它实际上解决了本地问题,而不会像其他答案所建议的那样弄乱全局配置。
3赞 Anthony 1/27/2017
我不得不在 config/database.yml 中从默认更改为 localhost - 它在同一台机器上,所以我不明白为什么host: 127.0.0.1
0赞 StylusEater 1/30/2017
安东尼,你是说你遇到了连接失败,直到你在database.yml中将localhost调整为127.0.0.1?如果是这种情况,我建议检查您的 /etc/hosts 文件。否则,可能会有一些与解析 localhost 相关的其他奇怪现象。
5赞 mdh 2/25/2017
与弄乱本地对等身份验证方法相比,这要优雅得多。
2赞 normic 1/21/2019
这再次击中了我,想到在localhost上发出哔哔声与将其告诉psql不同。真正的问题是,至少在 *nix 操作系统上,psql 将尝试通过本地套接字进行连接,默认情况下,仅允许用户 postgres 进行连接。
5赞 Mazen Ora 3/16/2015 #5

以下命令对我有用:

psql -d myDb -U username -W

评论

0赞 Yaroslav Nikitenko 12/8/2015
man psql-W --password Force psql to prompt for a password before connecting to a database. This option is never essential, since psql will automatically prompt for a password if the server demands password authentication. However, psql will waste a connection attempt finding out that the server wants a password. In some cases it is worth typing -W to avoid the extra connection attempt.
25赞 d.danailov 4/8/2015 #6

如果您有问题,您需要找到您的 .命令为:pg_hba.conf

find / -name 'pg_hba.conf' 2>/dev/null

然后更改配置文件:

Postgresql 9.3的

Postgresql 9.3的

Postgresql 9.4的

Postgresql 9.3的

下一步是:重新启动数据库实例:

service postgresql-9.3 restart

如果您有任何问题,您需要重新设置密码:

ALTER USER db_user with password 'db_password';

评论

1赞 JesseBoyd 2/6/2023
感谢您的 find 命令!使用 Fedoara 文件浏览器在任何搜索中都不会返回 pg_hba.conf。现在我终于可以更新该文件了
15赞 Luca Marletta 4/30/2015 #7

我正在克隆的服务器上移动数据目录,并且无法以postgres身份登录。像这样重置postgres密码对我有用。

root# su postgres
postgres$ psql -U postgres
psql (9.3.6) 
Type "help" for help. 
postgres=#\password 
Enter new password: 
Enter it again: 
postgres=#
7赞 sibosop 8/26/2015 #8

上面的编辑对我有用,在我发现我需要在进行编辑后重新启动 postgres 服务器之后。 对于 ubuntu:

sudo /etc/init.d/postgresql restart
23赞 Taimoor Changaiz 9/10/2015 #9
  1. 转到此 /etc/postgresql/9.x/main/ 并打开 pg_hba.conf 文件

就我而言:

$>  sudo nano /etc/postgresql/9.3/main/pg_hba.conf
  1. peer 替换为 md5

因此,这将更改为:

通过 Unix 域套接字进行数据库管理登录 本地所有 Postgres 对等体

# TYPE  DATABASE        USER            ADDRESS                 METHOD

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

这:

通过 Unix 域套接字进行数据库管理登录 本地所有 postgres md5

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
  1. 然后重新启动pg server:

    $> sudo 服务 postgresql 重启

以下是用于连接postgres的方法列表:

# METHOD can be "trust", "reject", "md5", "password", "gss", "sspi",
# "krb5", "ident", "peer", "pam", "ldap", "radius" or "cert".  Note that
# "password" sends passwords in clear text; "md5" is preferred since
# it sends encrypted passwords.

注意:如果您尚未创建 postgres 用户。创建它,现在您可以使用该用户凭据访问 postgres 服务器。

提示:如果postgres重新启动后它不起作用,则关闭终端并再次打开。

5赞 Alexandr Zaichenko 6/14/2016 #10

您只需将 METHOD 设置为信任即可。

#TYPE  DATABASE        USER            ADDRESS                 METHOD
local    all             all                                     trust

并重新加载postgres服务器。

# service postgresql-9.5 reload

pg_hba.conf 中的更改不需要 RESTART postgres 服务器。只需重新加载。

6赞 Manisha Vasani 7/21/2016 #11

连接使用。host=localhost

PGconn *conn = PQconnectdb(
    "host=localhost user=postgres dbname=postgres password=123"
);
12赞 Åsmund 8/10/2016 #12

如果要保留默认配置,但希望对一个特定的用户/数据库连接使用套接字连接进行 md5 身份验证,请在“local all/all”行之前添加一个“local”行:

# TYPE  DATABASE     USER         ADDRESS             METHOD

# "local" is for Unix domain socket connections only
local   dbname       username                         md5  # <-- this line
local   all          all                              peer
# IPv4 local connections:
host    all          all          127.0.0.1/32        ident
# IPv6 local connections:
host    all          all          ::1/128             ident

评论

0赞 eaydin 11/2/2018
这个答案中的“之前”值得在其他答案中进一步阐述。事实证明,psql 按顺序检查 pg_hba.conf 文件中的记录,如文档中所述: postgresql.org/docs/11/static/auth-pg-hba-conf.html
0赞 Kiry Meas 8/8/2019
# 类型数据库用户地址 method local username dbname md5 # <-- 此行 不按顺序排列
0赞 Åsmund 11/16/2020
@KiryMeas确实如此。固定。
6赞 Supun Muthutantrige 2/3/2017 #13

在 pg_hba.conf 中将 METHOD peer 更改为信任(/etc/postgresql/9.1/main/pg_hba.conf | 第 85 行)可以解决此问题。添加 md5 会要求输入密码,因此,如果需要避免使用密码,请使用 trust 而不是 md5

3赞 Bill 11/21/2017 #14

许多其他答案都与各种配置文件中的设置有关,而与 确实相关的答案适用并且是 100% 正确的。但是,请确保您正在修改正确的配置文件pg_hba.conf

正如其他人所提到的,配置文件位置可以被主配置文件中的各种设置覆盖,也可以在命令行上提供主配置文件的路径。-D

您可以在 psql 会话中使用以下命令来显示读取配置文件的位置(假设您可以启动 psql)。这只是一个故障排除步骤,可以帮助某些人:

select * from pg_settings where setting~'pgsql';  

您还应该确保 postgres 用户的主目录位于您期望的位置。我之所以这样说,是因为很容易忽略这一点,因为您的提示将显示“”而不是主目录的实际路径,因此它并不那么明显。许多安装默认 postgres 用户主目录为 。~/var/lib/pgsql

如果未设置为应有状态,请停止 postgresql 服务,并在以 root 身份登录时使用以下命令。还要确保 postgres 用户未登录到另一个会话:

usermod -d /path/pgsql postgres

最后,通过键入 来确保正确设置了 PGDATA 变量,这应该输出类似于以下内容的内容:echo $PGDATA

/path/pgsql/data

如果未设置,或显示的内容与预期不同,请检查您的启动或 RC 文件,例如 .profile 或 .bash.rc - 这将因您的操作系统和 shell 而有很大差异。确定计算机的正确启动脚本后,可以插入以下内容:

export PGDATA=/path/pgsql/data

对于我的系统,我把它放在里面,以便所有用户都可以访问它。/etc/profile.d/profile.local.sh

您现在应该能够像往常一样初始化数据库,并且您的所有 psql 路径设置都应该是正确的!

106赞 iamuser2 1/10/2018 #15

这对我有用!

sudo -u postgres psql

评论

4赞 Abubacker Siddik 11/1/2018
只要您当前登录的用户在 sudoers 文件中,这应该可以正常工作。
2赞 Epsilon47 1/12/2018 #16

我的问题是我没有键入任何服务器。由于占位符,我认为这是默认的,但是当我键入localhost时,它确实起作用了。

2赞 Marshall 1/30/2018 #17

如果您尝试在 Cloud 9 中找到此文件,您可以执行以下操作

sudo vim /var/lib/pgsql9/data/pg_hba.conf

按下可编辑/插入,按 3 次并键入将保存文件并退出IESC:wq

3赞 Mani 3/23/2018 #18

如果您在使用 rails 时遇到此问题,并且您知道您已经创建了带有密码的用户名以及正确的权限,那么您只需要将以下内容放在database.yml文件的末尾即可。

host: localhost

整体文件如下所示

development:
  adapter: postgresql
  encoding: unicode
  database: myapp_development
  pool: 5
  username: root
  password: admin
  host: localhost

您根本不需要触摸您的文件。快乐编码pg_hba.conf

41赞 Gihan Gamage 2/19/2019 #19
sudo psql --host=localhost --dbname=database-name --username=postgres

这解决了我的问题

评论

4赞 Hayden Thring 7/11/2019
我不认为它会那么简单,但这在 debian 9 下对我有用
5赞 tayfun Kılıç 9/10/2019 #20

pg_config用于提供编译信息,以帮助扩展和客户端程序编译和链接到 PostgreSQL。它对计算机上的活动 PostgreSQL 实例一无所知,只知道二进制文件。

pg_hba.conf 可以出现在许多其他地方,具体取决于 Pg 的安装方式。标准位置是数据库data_directory内的 pg_hba.conf(可以在 /home、/var/lib/pgsql、/var/lib/postgresql/[version]/、/opt/postgres/ 等等中),但用户和打包者可以将其放在他们喜欢的任何位置。不幸。

查找 pg_hba.conf 的唯一有效方法是询问正在运行的 PostgreSQL 实例 pg_hba.conf 在哪里,或者询问系统管理员它在哪里。你甚至不能依赖询问 datadir 在哪里并解析 postgresql.conf,因为初始化脚本可能会在启动 Pg 时传递类似 -c hba_file=/some/other/path 的参数。

你要做的是问PostgreSQL:

SHOW hba_file;

此命令必须在超级用户会话上运行,因此对于 shell 脚本,您可以编写如下内容:

psql -t -P format=unaligned -c 'show hba_file';

并设置环境变量 PGUSER、PGDATABASE 等,确保连接正确。

是的,这在某种程度上是一个先有鸡还是先有蛋的问题,因为如果用户无法连接(例如,在搞砸了编辑 pg_hba.conf 之后),你就找不到 pg_hba.conf 来修复它。

另一种选择是查看 ps 命令的输出,看看 postmaster 数据目录参数 -D 是否可见,例如

ps aux  | grep 'postgres *-D'

因为 pg_hba.conf 将在数据目录中(除非您在 Debian/Ubuntu 或某些衍生产品上使用它们的软件包)。

如果您专门针对从 Debian/Ubuntu 软件包安装了 PostgreSQL 的 Ubuntu 系统,它会变得更容易一些。您不必处理手动编译的源码 Pg,某人在其主目录中初始化了 datadir,或者在 /opt 中安装了 EnterpriseDB Pg 等。您可以询问 Debian/Ubuntu 多版本 Pg 管理器 pg_wrapper,其中 PostgreSQL 使用来自 pg_wrapper 的 pg_lsclusters 命令。

如果无法连接(Pg 未运行,或者需要编辑 pg_hba.conf 才能连接),则必须在系统中搜索 pg_hba.conf 文件。在 Mac 和 Linux 上,像 sudo find / -type f -name pg_hba.conf 这样的东西就可以了。然后检查同一目录中的 PG_VERSION 文件,以确保它是正确的 PostgreSQL 版本(如果您有多个版本)。(如果 pg_hba.conf 位于 /etc/ 中,请忽略此内容,而是父目录名称)。如果同一 PostgreSQL 版本有多个数据目录,则必须查看数据库大小,从 ps 检查正在运行的 postgres 的命令行,看看它的数据目录 -D 参数是否与您正在编辑的位置匹配,等等 https://askubuntu.com/questions/256534/how-do-i-find-the-path-to-pg-hba-conf-from-the-shell/256711

24赞 Rokas Lakštauskas 4/17/2020 #21

最简单的解决方案,无需更改配置。(Ubuntu的) 更改用户,然后连接到数据库 cli。

sudo -i -u postgres

psql

取自 https://www.digitalocean.com/community/tutorials/how-to-install-and-use-postgresql-on-ubuntu-18-04

6赞 Saranga kapilarathna 11/27/2020 #22

请按照以下步骤操作

1). 首先,导航到 /etc/postgresql/{your pg version}/main 目录。

我的版本是 10 然后:

cd /etc/postgresql/10/main

2). 这里驻留着 pg_hba.conf 文件需要做一些更改,您可能需要 sudo 访问。

sudo nano pg_hba.conf

3). 向下滚动文件,直到找到这个 -

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

4). 这里将 peer 更改为 md5,如下所示。

# Database administrative login by Unix domain socket
local   all             all                                md5
  • peer 意味着它将信任 UNIX 用户的真实性,因此不会

  • 提示输入密码。md5 表示它将始终要求输入密码, 并在使用 MD5 进行哈希处理后对其进行验证。

5).现在保存文件并重新启动 Postgres 服务器。

sudo service postgresql restart

现在应该没问题了。

11赞 alramdein 3/10/2021 #23

大多数解决方案建议编辑 .pg_hba.conf

对于不想编辑配置文件的你,基本上只需要登录用户即可。如果您使用的是 Linux 服务器,请使用以下命令postgres

sudo -i -u postgres

它将创建用户,然后登录到它。现在再次尝试 psql 命令。postgres

您还可以使用以下命令为用户添加密码:(您应该是 root 用户)postgres

passwd postgres

这是有效的,因为根据这个PostgreSQL的文档

对等身份验证

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

评论

0赞 mydoghasworms 4/8/2021
对于只想最初重置 postgres 密码的人来说,这是更好的方法。
1赞 Ravi Kumar Gupta 6/23/2021 #24

在 CentOS 7 PG 10 上,文件路径为

/var/lib/pgsql/10/data/pg_hba.conf
2赞 Singh 11/30/2021 #25

就我而言,我什至无法编辑或查看pg_hba.conf文件的内容。

有效的是:

/etc/postgresql/14/main$ sudo vi pg_hba.conf

具有 sudo 权限的 Vi 编辑器。

17赞 Pranav Premarajan 6/9/2022 #26

当您未提供主机时,可能会发生此错误。以下方案与此类似。

user@homepc:~$ psql -d test_db -U test_user psql:错误:致命:用户“test_user”
的对等身份验证失败 user@homepc:~$
psql -h localhost -d test_db -U test_user
用户test_user的密码:

提供主机解决了我在psql命令行中的问题。尝试在 rails 中的 postgress 的连接配置中提供主机。

2赞 Shubham Jain 7/14/2023 #27

这个错误对我产生了误导。我在带有挂载端口的 docker 中运行 pg。 添加到 psql 命令解决了该问题。-h <HostIp> -p <HostPort>

psql -U <User> -d <DB> -W -h <HostIp> -p <HostPort>

评论

1赞 Theo Stefou 9/18/2023
即使我不在 docker 中,有本机安装并且拒绝让我以特定用户身份连接,直到我运行上述命令,这对我有用。
0赞 Rozy Mahsun 7/30/2023 #28

您无需编辑任何内容,只需使用以下命令:

$psql -U postgres -h 127.0.0.1 -d [your_db]

干杯