psql:严重:用户“ dev”的对等身份验证失败


198

当我创建一个新用户时,却无法登录数据库。
我这样做是这样的:

postgres@Aspire:/home/XXX$ createuser dev
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) y

然后创建一个数据库:

postgres@Aspire:/home/XXX$ createdb -O dev test_development

之后,我尝试psql -U dev -W test_development登录,但出现错误:

psql: FATAL:  Peer authentication failed for user "dev"

我试图解决问题,但失败了。



现在,要提示您回答上述问题,您需要将其添加--interactive到命令中:createuser --interactive joe
user3791372

Answers:


310

尝试:

psql -U user_name  -h 127.0.0.1 -d db_name

哪里

  • -U 是数据库用户名
  • -h 是本地服务器的主机名/ IP,因此避免使用Unix域套接字
  • -d 是要连接的数据库名称

然后,它被Postgresql评估为“网络”连接,而不是Unix域套接字连接,因此不像您可能会看到的那样被评估为“本地”连接pg_hba.conf

local   all             all                                     peer

15
我需要(版本9.4):psql -U用户名-h 127.0.0.1 -d数据库名
Gregor

9
多么令人讨厌的工具。手册说psql [option...] [dbname [username]],所以你会认为psql dbname username会工作..
djeikyb

2
也为我工作。我还认为,这是一种比更改配置文件更可取的方法,尤其是当您对正在做的事情一无所知并且仅遵循SO解答来解决您的问题时。
borisano 2015年

1
非常感谢,尽管我正在研究为什么它是正确的解决方案,但这对我还是很有帮助的。但是,在另一台计算机的配置中,我将以psql -U username -d database登录。所以我想可以接受的解决方案取决于情况。
Lazarus Rising

2
好答案。我以postgres身份登录后从数据库内部访问, \c glossary john FATAL: Peer authentication failed for user "john"然后可以\c glossary john localhost Password for user john: SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off) You are now connected to database "glossary" as user "john" on host "localhost" at port "5432".正常工作。
请看

215

您的连接失败,因为默认情况下psql使用peer身份验证通过UNIX套接字进行连接,这要求当前UNIX用户具有与相同的用户名psql。因此,您将必须创建UNIX用户dev,然后以身份登录dev或使用sudo -u dev psql test_development它们来访问数据库(和psql应该要求输入密码)。

如果您不能或不想创建UNIX用户,例如您只想连接到数据库来 临时查询),则使用以下命令强制进行套接字连接psql --host=localhost --dbname=test_development --username=dev(如@meyerson答案所指出的)将解决您的直接问题。

但是,如果您打算通过Unix套接字而不是对等方法强制进行密码身份验证,请尝试更改以下内容 pg_hba.conf *行:

# TYPE DATABASE USER ADDRESS METHOD
local  all      all          peer

# TYPE DATABASE USER ADDRESS METHOD
local  all      all          md5
  • peer表示它将信任UNIX用户的身份(真实性)。因此,不要求输入密码。

  • md5表示它将始终要求输入密码,并使用散列后对其进行验证MD5

当然,您也可以为特定的数据库或用户创建更特定的规则,其中一些用户具有 peer,其他则需要密码。

更改pg_hba.confPostgreSQL是否运行后,您需要通过重新加载(pg_ctl reload)或重新启动(sudo service postgresql restart)。

*该文件pg_hba.conf很可能位于/etc/postgresql/9.x/main/pg_hba.conf

编辑: @ Chloe,@ JavierEH,@ Jonas Eicher,@ fccoelho,@ Joanis,@ Uphill_的评论已纳入答案。


5
您如何允许peer AND md5?设置后md5,我将无法再与postgres用户登录!我尝试添加多行,并用逗号分隔该方法,但是它们不起作用。好的,我找到了mgoldwasser答案,并且有效。我刚刚为用户添加了另一行postgres方法peer
Chloe 2014年

3
不用担心,您可以为特定用户设置对等身份验证(例如,您的用户名或postgres)。似乎特定规则优先于一般规则
JavierIEH 2014年

1
在某些发行版本中,也可以在这里找到该文件:/var/lib/pgsql/9.4/data/pg_hba.conf
Jonas Eicher

2
不重启PostgreSQL就不能这样做吗?您不能只在pg_user表中指定身份验证方法吗?
fccoelho 2015年

2
您可以重新加载而不是重新启动。这将重新加载pg_hba表。为我工作。
Joanis 2015年

29

对等身份验证意味着postgres向操作系统询问您的登录名,并将其用于身份验证。要在postgres上使用对等身份验证以用户“ dev”身份登录,您还必须是操作系统上的用户“ dev”。

您可以在Postgresql文档中找到有关身份验证方法的详细信息

提示:如果不再使用身份验证方法,则将服务器与网络断开连接,并将方法“ trust”用于“ localhost”(并在启用方法“ trust”的情况下再次检查您的服务器无法通过网络访问)。


1
感谢您的答复。但是如果我将其更改dev为系统用户,则仍然无法正常工作XXX
hsming 2013年

2
斯蒂芬的答案是正确的。我刚刚在文档中添加了一个链接,该链接将在解释每种身份验证方法的文档中显示。
dsh

25

指定时:

psql -U user

它通过UNIX套接字进行连接peer,除非另有说明,pg_hba.conf否则该套接字默认使用身份验证。

您可以指定:

host    database             user             127.0.0.1/32       md5
host    database             user             ::1/128            md5

获取指定database和的回送接口(IPv4和IPv6)上的TCP / IP连接user

更改后,您必须重新启动postgres或重新加载其配置。重新启动应该可以在基于RHEL / Debian的现代发行版中工作:

service postgresql restart

重新加载应以以下方式工作:

pg_ctl reload

但是该命令可能会根据PATH配置的不同而有所不同-您可能必须指定绝对路径,该绝对路径可能会有所不同,具体取决于postgres的安装方式。

然后,您可以使用:

psql -h localhost -U user -d database

登录userdatabase通过TCP / IP 指定的登录名。 md5代表加密密码,而您也可以password在授权过程中指定纯文本密码。只要数据库服务器只能本地访问而没有网络访问权限,那么这两个选项就无关紧要。

重要说明:pg_hba.conf事项的 定义顺序-规则是像iptables一样自上而下读取的,因此您可能希望在规则上方添加建议的规则:

host    all             all             127.0.0.1/32            ident

重新的重要注意事项: -顺序很重要+1
鹰眼

23

尽管@flaviodesousa的答案有效,但它也使所有用户(其他所有人)必须输入密码。

有时保持对其他所有人的对等身份验证是有意义的,但对于服务用户则是例外。在这种情况下,您可能想在pg_hba.conf中添加一行,如下所示:

local   all             some_batch_user                         md5

我建议您在带注释的标题行的正下方添加此行:

# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   all             some_batch_user                         md5

您将需要使用以下命令重新启动PostgreSQL

sudo service postgresql restart

如果您使用的是9.3,则pg_hba.conf很可能是:

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


12

当我遇到它时,这对我有用:

sudo -u username psql

仅当您在系统上以及在postgres中创建一个新用户时,此方法才有效-hsming只想使用新创建的postgres用户来连接到postgres dev
肯尼斯(Kenneth)

8

最简单的解决方案:

CREATE USER dev WITH PASSWORD 'dev';
CREATE DATABASE test_development;
GRANT ALL PRIVILEGES ON DATABASE test_development to dev;
ALTER ROLE dev CREATEROLE CREATEDB;

6

我只需要添加 -h localhost


我的问题是在Raspberry上使用postgres。^^^为我工作!谢谢!
tidydee

2

就我而言,我正在使用其他端口。默认值为5432。我使用的是5433。这对我有用:

$ psql -f update_table.sql -d db_name -U db_user_name -h 127.0.0.1 -p 5433

当您安装了多个postgres时,这会自动发生。
Galigator

1

对于以后的人们来说,这postgres是在/usr/lib/postgresql/10/bin我的Ubuntu服务器上。

我将其添加到我的.bashrc文件的PATH中,并在末尾添加了这一行

PATH=$PATH:/usr/lib/postgresql/10/bin

然后在命令行上

$> source ./.bashrc

我刷新了bash环境。现在我可以postgres -D /wherever从任何目录使用


1

pg_dump -h localhost -U postgres -F c -b -v -f mydb.backup mydb


这个答案是什么问题?为什么可能-U postgres至关重要?那些破折号是什么?
灰胡子

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.