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

时间:2013-07-03 08:39:19

标签: postgresql

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

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"

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

12 个答案:

答案 0 :(得分:272)

尝试:

psql user_name  -h 127.0.0.1 -d db_name

,其中

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

然后将其评估为"网络"通过Postgresql连接而不是Unix域套接字连接,因此不被评估为" local"如您在pg_hba.conf中看到的那样连接:

local   all             all                                     peer

答案 1 :(得分:205)

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

如果您不能或不想创建UNIX用户,就像您只想连接到数据库以进行 ad hoc 查询一样,使用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而其他用户需要密码。

在PostgreSQL运行后更改pg_hba.conf之后,您需要通过重新加载(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的评论。评论纳入了答案。

答案 2 :(得分:29)

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

您可以在Postgresql documentation中找到身份验证方法的详细信息。

提示:如果不再使用身份验证方法,请断开服务器与网络的连接,并使用“trust”方法“localhost”(并仔细检查您的服务器是否无法通过网络访问) “信任”已启用)。

答案 3 :(得分:23)

指定时:

psql -U user

它通过UNIX Socket连接,默认情况下使用peer身份验证,除非在pg_hba.conf中另有规定。

您可以指定:

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

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

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

service postgresql restart

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

pg_ctl reload

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

然后你可以使用:

psql -h localhost -U user -d database

通过TCP / IP使用user登录到指定的databasemd5代表加密密码,而您也可以在授权期间为明文密码指定password。只要数据库服务器只能在本地访问且没有网络访问权限,这两个选项就不应该是一件大事。

重要提示: pg_hba.conf中的定义顺序很重要 - 规则从上到下读取,如iptables,因此您可能希望在规则之上添加建议规则:

host    all             all             127.0.0.1/32            ident

答案 4 :(得分:21)

虽然@ 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

答案 5 :(得分:12)

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

sudo -u username psql

答案 6 :(得分:7)

最简单的解决方案:

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

答案 7 :(得分:2)

在我的情况下,我使用的是不同的端口。默认值是5432.我使用的是5433.这对我有用:

contentView

答案 8 :(得分:1)

对于将来会看到这种情况的人,postgres位于我的Ubuntu服务器上的/usr/lib/postgresql/10/bin中。

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

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

然后在命令行上

$> source ./.bashrc

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

答案 9 :(得分:1)

我只需要添加-h localhost

答案 10 :(得分:1)

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

答案 11 :(得分:0)

尝试:

psql -U角色名-d数据库-h hostname..com -W