992

我收到错误:

FATAL: Peer authentication failed for user "postgres"

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

这是 my pg_hba.conf、 mydatabase.yml完整 trace 的转储

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

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

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

知道我哪里出错了吗?

4

25 回答 25

1309

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

这一行:

local   all             postgres                                peer

应该:

local   all             postgres                                md5

* 这个文件的位置不是很一致。该命令locate pg_hba.conf应该有所帮助;这里有一些例子:/etc/postgresql/*/main/pg_hba.conf/var/lib/pgsql/data/pg_hba.conf

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

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

对等身份验证

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

密码认证

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

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

样品位置pg_hba.conf
/etc/postgresql/9.1/main/pg_hba.conf

于 2013-09-06T18:25:11.150 回答
555

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

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

    本地所有 postgres 同行

    本地所有 postgres 信任

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

    本地所有所有对等

    本地所有所有 md5

    如果您使用 nano 编辑器,请使用 double Escape, x, y,退出Enter以保存配置文件。

  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.conffrom

    本地所有 postgres 信任

    本地所有 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

身份验证方法详细信息:

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

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

md5 - 基于密码的身份验证

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

于 2014-11-04T12:25:20.887 回答
294

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

享受!

于 2015-02-28T15:51:04.187 回答
89

这对我有用!

sudo -u postgres psql
于 2018-01-10T07:39:13.040 回答
31
sudo psql --host=localhost --dbname=database-name --username=postgres

这解决了我的问题

于 2019-02-19T09:43:12.003 回答
22
  1. 转到这个/etc/postgresql/9.x/main/并打开pg_hba.conf文件

就我而言:

$>  sudo nano /etc/postgresql/9.3/main/pg_hba.conf
  1. 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服务器:

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

于 2015-09-10T11:29:37.057 回答
21

如果您有问题,您需要找到您的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';

于 2015-04-08T14:24:16.403 回答
20

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

sudo -i -u postgres

psql

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

于 2020-04-17T13:18:03.650 回答
12

我有同样的问题。

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

然后进行更改。

于 2013-10-14T02:25:57.263 回答
12

我正在克隆服务器上移动数据目录,并且无法以 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=#
于 2015-04-30T12:20:27.487 回答
12

如果您想保留默认配置,但希望通过套接字连接对一个特定用户/数据库连接进行 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
于 2016-08-10T12:11:15.937 回答
7

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

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

sudo -i -u postgres

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

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

passwd postgres

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

对等身份验证

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

于 2021-03-10T14:44:15.623 回答
7

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

sudo /etc/init.d/postgresql restart
于 2015-08-25T21:42:51.913 回答
6

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

于 2017-02-03T05:40:44.850 回答
6

结合使用host=localhost

PGconn *conn = PQconnectdb(
    "host=localhost user=postgres dbname=postgres password=123"
);
于 2016-07-21T09:13:34.410 回答
5

以下命令对我有用:

psql -d myDb -U username -W
于 2015-03-16T10:27:10.047 回答
5

您只需将 METHOD 设置为信任。

#TYPE  DATABASE        USER            ADDRESS                 METHOD
local    all             all                                     trust

并重新加载 postgres 服务器。

# service postgresql-9.5 reload

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

于 2016-06-14T13:11:02.037 回答
5

请按照以下步骤

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

我的版本是 10 然后:

cd /etc/postgresql/10/main

2)。这里驻留 pg_hba.conf 文件需要在此处进行一些更改,您可能需要 sudo 访问权限。

sudo nano pg_hba.conf

3)。向下滚动文件直到找到这个 -</p>

# 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

现在应该没问题了。

于 2020-11-27T10:22:00.257 回答
4

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

于 2019-09-10T05:58:25.870 回答
3

许多其他答案与各种配置文件中的设置有关,而与这些有关的答案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

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

/path/pgsql/data

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

export PGDATA=/path/pgsql/data

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

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

于 2017-11-20T20:34:51.253 回答
2

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

host: localhost

整个文件如下所示

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

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

于 2018-03-23T10:08:00.693 回答
2

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

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

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

于 2018-01-29T19:17:04.687 回答
2

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

于 2018-01-12T12:25:53.143 回答
1

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

/var/lib/pgsql/10/data/pg_hba.conf
于 2021-06-23T12:46:15.313 回答
1

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

起作用的是:

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

具有 sudo 权限的 Vi 编辑器。

于 2021-11-29T18:58:35.650 回答