获取错误:尝试让pgsql使用rails时,用户“postgres”的对等身份验证失败

我得到了错误:

FATAL: Peer authentication failed for user "postgres"

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

这是我的#0,我的#1完整跟踪的转储

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

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

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

知道我哪里做错了吗?

1019533 次浏览

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

这一行:

local   all             postgres                                peer

应该是:

local   all             postgres                                md5

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


定位hba.conf

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

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

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


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

对等认证

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

密码验证

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

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

我也有同样的问题。

德帕的解决方案是绝对正确的。

只要确保你有一个用户配置为使用PostgreSQL。

检查文件:

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

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

更进一步。如果你现在还好好的…

按照@Depa的说明更新。

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

然后做出改变。

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

  1. 打开文件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

    如果您使用的是纳米编辑器,请使用双EscapexyEnter退出以保存配置文件。

  2. 重新启动服务器

     $ sudo service postgresql restart

    输出:* Restarting PostgreSQL 13 database server

  3. 登录psql并设置密码

     $ psql -U postgresdb> 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

    to

    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-基于密码的身份验证

参考资料检查这里

如果您通过localhost(127.0.0.1)连接,则不应该遇到该特定问题。我不会过多使用pg_hba.conf,而是会调整您的连接字符串:

psql -U someuser -h 127.0.0.1 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 someuserEnter password for new role:Enter it again:Shall the new role be a superuser? (y/n) nShall the new role be allowed to create databases? (y/n) yShall 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

好好享受!

下面的命令对我有用:

psql -d myDb -U username -W

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

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

之后更改配置文件:

PostgreSQL 9.3

PostgreSQL 9.3

PostgreSQL 9.4

Postgresql 9.3

下一步是:重新启动db实例:

service postgresql-9.3 restart

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

ALTER USER db_user with password 'db_password';

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

root# su postgrespostgres$ psql -U postgrespsql (9.3.6)Type "help" for help.postgres=#\passwordEnter new password:Enter it again:postgres=#

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

sudo /etc/init.d/postgresql restart
  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 onlylocal   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 onlylocal   all             all                                     md5# IPv4 local connections:host    all             all             127.0.0.1/32            md5
  1. 然后重新启动pg服务器:

    重新启动后端服务

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

你只需要设置方法来信任。

#TYPE  DATABASE        USER            ADDRESS                 METHODlocal    all             all                                     trust

重新加载postgres服务器。

# service postgresql-9.5 reload

更改pg_hba.conf不需要RESTART postgres服务器。

在连接中使用host=localhost

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

如果您想保留默认配置,但希望对一个特定的user/db连接使用套接字连接进行md5身份验证,请在“localall/all”行之前添加“localline”行:

# TYPE  DATABASE     USER         ADDRESS             METHOD
# "local" is for Unix domain socket connections onlylocal   dbname       username                         md5  # <-- this linelocal   all          all                              peer# IPv4 local connections:host    all          all          127.0.0.1/32        ident# IPv6 local connections:host    all          all          ::1/128             ident

在pg_hba.conf中将方法同行更改为信任(/etc/postgresql/9.1/main/pg_hba.conf|第85行)解决了这个问题。添加md5需要密码,因此如果需要避免使用密码,请使用信任而不是md5

许多其他答案与各种配置文件中的设置有关,与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文件,例如. file或.bash.rc-这将根据您的操作系统和shell而有很大差异。一旦您为您的机器确定了正确的启动脚本,您可以插入以下内容:

export PGDATA=/path/pgsql/data

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

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

这对我有用!!!

sudo -u postgres psql

我的问题是我没有输入任何服务器。我认为这是一个默认值,因为占位符,但当我输入localhost它确实有效。

如果您试图在Cloud 9中找到此文件,您可以这样做

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

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

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

host: localhost

整体文件如下所示

development:adapter: postgresqlencoding: unicodedatabase: myapp_developmentpool: 5username: rootpassword: adminhost: localhost

你根本不需要碰你的pg_hba.conf文件。编码愉快

sudo psql --host=localhost --dbname=database-name --username=postgres

这解决了我的问题

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

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

找到pg_hba.conf唯一有效的方法是询问正在运行的PostgreSQL实例pg_hba.conf在哪里,或者询问系统管理员在哪里。你甚至不能依靠询问datadir在哪里并解析postgresql.conf,因为初始化脚本可能会在启动Pg时传递-chba_file=/一些/其他/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中安装了Enterprise DB Pg,等等。你可以问pg_wrapper,Debian/Ubuntu多版本Pg管理器,PostgreSQL在哪里使用pg_wrapper的pg_lsclusters命令。

如果您无法连接(Pg没有运行,或者您需要编辑pg_hba.conf才能连接),则必须在系统中搜索pg_hba.conf文件。在Mac上Linuxsudo find-type f-namepg_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

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

sudo -i -u postgres
psql

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

请按照以下步骤操作

1)。首先,导航到 /etc/postgresql/{你的pg版本}/主目录。

我的版本是10然后:

cd /etc/postgresql/10/main

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

sudo nano pg_hba.conf

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

# Database administrative login by Unix domain socketlocal   all             postgres                                peer

4)。这里将对等点更改为md5,如下所示。

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

  • 提示输入密码。md5意味着它总是会询问密码,并在使用MD5哈希后验证它。

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

sudo service postgresql restart

现在应该没事了。

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

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

sudo -i -u postgres

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

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

passwd postgres

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

节点认证

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

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

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

在我的情况下,我甚至无法编辑或查看pg_hba.conf文件的内容。

起作用的是:

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

具有sudo权限的Vi编辑器。

当您不提供主机时,可能会发生此错误。以下场景类似于它。

user@homepc:~$psql-dtest_db-Utest_user
psql: error: FATAL:用户"test_user"的对等身份验证失败
user@homepc:~$psql-hlocalhost-dtest_dbtest_user
用户test_user密码:

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

此外,如果您无法从postgres帐户访问脚本,您可以使用下面的方法。

$ cat ./init-user-db.sh | sudo -i -u postgres bash