ChatGPT解决这个技术问题 Extra ChatGPT

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

我收到错误:

FATAL: Peer authentication failed for user "postgres"

当我尝试让 postgres 与 Rails 一起工作时。

这是我的 pg_hba.conf、我的 database.yml 和一个 dump of the full trace

我在 pg_hba 中将身份验证更改为 md5 并尝试了不同的方法,但似乎都没有。

我还尝试按照 Rails 3.2, FATAL: Peer authentication failed for user (PG::Error) 创建一个新用户和数据库

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

知道我哪里出错了吗?

1):确保您创建了一个名为“postgres”的用户并在您的数据库上拥有权限 2):确保他有密码 3):确保您的 config/database.yml 包含权限凭据(用户名 + 密码)
需要将everyplace peer 和 indent 设置为 md5
请参阅 also this answer - 连接可能在 localhost 上失败,但在 127.0.0.1 上成功。
在我的情况下,我需要在 database.yml 文件中添加 host: localhost

N
Nitin Nain

问题仍然是您的 pg_hba.conf 文件*。

这一行:

local   all             postgres                                peer

应该:

local   all             postgres                                md5

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

定位 hba.conf

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

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

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

这些是根据 official PostgreSQL docs on authentication methodspeermd5 选项的简要说明。

对等身份验证

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

密码认证

基于密码的身份验证方法是 md5 和密码。除了通过连接发送密码的方式(即分别为 MD5 散列和明文)之外,这些方法的操作类似。如果您完全担心密码“嗅探”攻击,那么首选 md5。如果可能,应始终避免使用纯密码。但是,md5 不能与 db_user_namespace 功能一起使用。如果连接受 SSL 加密保护,则可以安全地使用密码(但如果依赖于使用 SSL,则 SSL 证书身份验证可能是更好的选择)。


更改此 /etc/init.d/postgresql reload 后,您需要重新加载您的 postgresql 服务
把这个放在这里,因为我总是忘记这个文件在哪里 /etc/postgresql/9.1/main/pg_hba.conf
@funkotron 至少在我的 ElementaryOS (Ubuntu) 安装中,sudo service postgreql restart 也可以。
回答我自己的问题:“对等”身份验证意味着 postgres 向操作系统询问您的登录名并将其用于身份验证,因此操作系统和 postgres 上的用户必须相同。 'md5' 使用加密密码认证。
我理解这种变化。但为什么这不是默认行为?使用 md5 有什么缺点吗?
q
questionto42standswithUkraine

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

打开文件 pg_hba.conf。对于 Ubuntu,例如使用 /etc/postgresql/13/main$ sudo nano pg_hba.conf 并更改文件底部的这一行,它应该是设置的第一行:local all postgres peer to local all postgres trust旁注:如果您也希望能够与其他用户连接,您还需要更改: local all all peer to local all all md5 如果您使用 nano 编辑器,请使用双 Escape 退出,x,y,Enter 保存配置文件。重新启动服务器 $ sudo service postgresql restart 输出: * 重新启动 PostgreSQL 13 数据库服务器 登录到 psql 并设置您的密码 $ psql -U postgres db> ALTER USER postgres with password 'your-pass';输出:ALTER ROLE 旁注:如果您有其他用户,他们也需要密码:db> ALTER USER my_user with password 'your-pass';然后输入: exit 最后将 pg_hba.conf 从 local all postgres trust 改为 local all postgres md5 再次重启服务器 $ sudo service postgresql restart 输出: * Restarting PostgreSQL 13 database server Login at psql with postgres user 重启 postgresql 服务器后, postgres 用户接受您选择的密码:psql -U postgres 输出:用户 postgres 的密码:psql (13.4 (Ubuntu 13.4-1.pgdg20.04+1)) 键入“help”以获得帮助。你在 psql 中: postgres=# 旁注:如果你添加了用户和密码,现在同样适用于 my_user: psql -d YOUR_DB_NAME -U my_user 这将询问你 my_user 的新密码。

身份验证方法详细信息:

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

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

md5 - 基于密码的身份验证

供进一步参考check here


将方法更改为“信任”对我有用。 +1 用于说明身份验证方法的详细信息。
在 OS X homebrew 上,默认值是 trust,而在 Ubuntu 上,默认值设置为“peer”,这导致我的设置与我同事的设置不一致。我们将他更改为 MD5 并没有帮助,因此“信任”是这里的真正答案(我们只是在进行开发测试)。应该得到更多的支持。
你也可以从一开始就在每个地方设置 md5
这种方式对我有用,首先使用方法 md5 不是。
需要使用相同的密码吗? sudo passwd postgres
S
StylusEater

如果您通过 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

享受!


我认为这是最好的解决方案,因为它实际上解决了本地问题,而不会像其他答案所建议的那样搞乱全局配置。
我不得不在 config/database.yml 中将 host: 127.0.0.1 从默认更改为 localhost - 它在同一台机器上,所以我不明白为什么
Anthony,您是说在您将 database.yml 中的 localhost 调整为 127.0.0.1 之前遇到了连接失败?如果是这种情况,我建议检查您的 /etc/hosts 文件。否则,可能存在与解析 localhost 相关的其他一些奇怪问题。
与使用本地对等身份验证方法相比,这要优雅得多。
这再次击中了我,想到在 localhost 上蜜蜂与告诉 psql 不同。真正的问题是,至少在 *nix 操作系统上 psql 将尝试通过本地套接字连接,默认情况下仅允许用户 postgres 连接。
i
iamuser2

这对我有用!

sudo -u postgres psql

只要您当前登录的用户在 sudoers 文件中,这应该可以正常工作。
S
Suraj Rao
sudo psql --host=localhost --dbname=database-name --username=postgres

这解决了我的问题


我不认为它会那么简单,但这在 debian 9 下对我有用
d
d.danailov

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

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

然后更改配置文件:

PostgreSQL 9.3

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

PostgreSQL 9.4

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

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

service postgresql-9.3 restart

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

ALTER USER db_user with password 'db_password';


T
Taimoor Changaiz

转到这个 /etc/postgresql/9.x/main/ 并打开 pg_hba.conf 文件

就我而言:

$>  sudo nano /etc/postgresql/9.3/main/pg_hba.conf

用 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

然后重启pg服务器:$> sudo service postgresql restart

以下是用于连接 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 重新启动后它不起作用,则关闭终端并再次打开。


R
Rokas Lakštauskas

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

sudo -i -u postgres

psql

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


n
nirvanastack

我有同样的问题。

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

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

检查文件:

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

此文件的权限应授予您注册 psql 的用户。

更远。如果你现在还好..

按照@depa 的说明进行更新。

IE

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

然后进行更改。


我面临同样的问题。但是我不知道我应该需要什么权限。你能帮助我吗。我得到 'ls' 命令的输出是 -rw-r----- 1 postgres postgres 4640 Jun 16 09:59 /etc/postgresql/9.5/main/pg_hba.conf
m
mwfearnley

我正在克隆服务器上移动数据目录,并且无法以 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=#

Å
Åsmund

如果您想保留默认配置,但希望通过套接字连接对一个特定用户/数据库连接进行 md5 身份验证,请在“本地全部/全部”行之前添加“本地”行:

# 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

此答案中的“之前”值得在其他答案中进行更多详细说明。事实证明 psql 按文档中所述顺序检查 pg_hba.conf 文件中的记录:postgresql.org/docs/11/static/auth-pg-hba-conf.html
# TYPE DATABASE USER ADDRESS METHOD local username dbname md5 # <-- 这一行不按顺序
@KiryMeas 确实。固定的。
s
sibosop

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

sudo /etc/init.d/postgresql restart

D
Dharman

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

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

sudo -i -u postgres

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

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

passwd postgres

这是有效的,因为根据这个 PostgreSQL's Documentation

对等身份验证

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


对于只想重置 postgres 密码的人来说,这是更好的方法。
S
Supun Muthutantrige

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


I
Iharob Al Asimi

在连接中使用 host=localhost

PGconn *conn = PQconnectdb(
    "host=localhost user=postgres dbname=postgres password=123"
);

M
Mazen Ora

以下命令对我有用:

psql -d myDb -U username -W

人 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.
A
Alexandr Zaichenko

您只需将 METHOD 设置为信任。

#TYPE  DATABASE        USER            ADDRESS                 METHOD
local    all             all                                     trust

并重新加载 postgres 服务器。

# service postgresql-9.5 reload

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


S
Saranga kapilarathna

请按照以下步骤

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

现在应该没问题了。


t
tayfun Kılıç

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

根据 Pg 的安装方式,pg_hba.conf 可以出现在许多其他地方。标准位置是数据库的 data_directory 中的 pg_hba.conf(可能在 /home、/var/lib/pgsql、/var/lib/postgresql/[version]/、/opt/postgres/ 等)但是用户和打包者可以把它放在他们喜欢的任何地方。很遗憾。

找到 pg_hba.conf 的唯一有效方法是询问正在运行的 PostgreSQL 实例它的 pg_hba.conf 在哪里,或者询问系统管理员它在哪里。你甚至不能依赖于询问数据目录在哪里并解析 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 系统,它会变得更容易一些。您不必处理有人在其主目录中为 initdb 提供数据目录的手动编译源 Pg,或在 /opt 中安装 EnterpriseDB Pg 等。您可以询问 pg_wrapper,Debian/Ubuntu multi -version Pg 管理器,其中 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


B
Bill

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

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

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

select * from pg_settings where setting~'pgsql';  

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

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

usermod -d /path/pgsql postgres

最后,通过键入 echo $PGDATA 确保您的 PGDATA 变量设置正确,这应该输出类似于:

/path/pgsql/data

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

export PGDATA=/path/pgsql/data

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

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


P
Pranav Premarajan

当您不提供主机时,可能会出现此错误。下面的场景类似于它。

user@homepc:~$ psql -d test_db -U test_user psql: error: FATAL: Peer authentication failed for user "test_user" user@homepc:~$ psql -h localhost -d test_db -U test_user 用户 test_user 的密码:

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


E
Epsilon47

我的问题是我没有输入任何服务器。由于占位符,我认为这是默认设置,但是当我输入 localhost 时它确实有效。


M
Marshall

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

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

I 编辑/插入,按 ESC 3 次并输入 :wq 将保存文件并退出


M
MD. Khairul Basar

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

host: localhost

整个文件如下所示

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

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


S
Singh

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

起作用的是:

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

具有 sudo 权限的 vi 编辑器。


R
Ravi Kumar Gupta

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

/var/lib/pgsql/10/data/pg_hba.conf