【问题标题】:psql: FATAL: Peer authentication failed for user "dev"psql:致命:用户“dev”的对等身份验证失败
【发布时间】:2013-06-30 20:54:01
【问题描述】:

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

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"

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

【问题讨论】:

  • 现在,要提示您回答上述问题,您需要在命令中添加--interactivecreateuser --interactive joe

标签: postgresql


【解决方案1】:

试试:

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

【讨论】:

  • 我需要 (ver 9.4): psql -U user-name -h 127.0.0.1 -d db-name
  • 多么令人讨厌的工具。手册上写着psql [option...] [dbname [username]],所以你会认为psql dbname username 会起作用..
  • 也为我工作。我也认为这是比更改配置文件更可取的方法,尤其是当您不知道自己在做什么并且只是按照 SO 回答来解决您的问题时。
  • 这对我有用,非常感谢,尽管我正在研究为什么它是正确的解决方案。尽管如此,在另一台机器的配置中,我会以 psql -U username -d database 的身份登录。所以我想接受的解决方案取决于具体情况。
  • 好答案。我以 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". 它有效。
【解决方案2】:

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

如果您不能或不想创建 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,而其他用户则需要密码。

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

【讨论】:

  • 你如何允许peer AND md5?当我设置md5时,我就不能再用postgres用户登录了!我尝试添加多行,并用逗号分隔方法,但它们不起作用。好的,我找到了mgoldwasser 的答案并且有效。我刚刚使用方法peer 为用户postgres 添加了另一行!
  • 别担心,您可以为特定用户设置对等身份验证(例如,您的用户名或 postgres)。似乎特定规则优先于一般规则
  • 在某些发行版上,该文件也可能在此处找到:/var/lib/pgsql/9.4/data/pg_hba.conf
  • 如果不重新启动 postgresql 就不能这样做吗?不能只在pg_user表中指定认证方式吗?
  • 您可以重新加载而不是重新启动。这会重新加载 pg_hba 表。为我工作。
【解决方案3】:

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

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

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

【讨论】:

  • 感谢您的回答。但如果我将dev 更改为系统用户XXX,它仍然不起作用
  • stefan 的回答是正确的。我刚刚在文档中添加了一个链接,在审核我的编辑时会看到该链接,其中解释了每种身份验证方法。
【解决方案4】:

当您指定时:

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

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

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

host    all             all             127.0.0.1/32            ident

【讨论】:

  • 重要提示:-订单很重要+1
【解决方案5】:

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

【讨论】:

    【解决方案6】:

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

    sudo -u username psql
    

    【讨论】:

    • 仅当您在系统和 postgres 中创建全新用户时才有效 -- hsming 只想使用新创建的 postgres 用户 dev 连接到 postgres。
    【解决方案7】:

    我只需要添加-h localhost

    【讨论】:

    • 我的问题是在 Raspberry 上使用 postgres。 ^^^ 为我工作!!谢谢!
    【解决方案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;
    

    【讨论】:

      【解决方案9】:

      就我而言,我使用的是不同的端口。默认值为 5432。我使用的是 5433。这对我有用:

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

      【讨论】:

      • 当您安装了多个 postgres 时,这可能会自动发生。
      【解决方案10】:

      对于将来看到这个的人,postgres 在我的 Ubuntu 服务器上的 /usr/lib/postgresql/10/bin 中。

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

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

      然后在命令行上

      $> source ./.bashrc
      

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

      【讨论】:

        【解决方案11】:

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

        【讨论】:

        • 这回答了什么问题?为什么-U postgres 可能是关键?那些破折号到底是什么?
        【解决方案12】:

        在终端尝试:

        >> psql -U role_name -d database -h hostname.<domain>.com -W
        

        【讨论】:

        • 请为您的回答添加更多上下文。
        猜你喜欢
        • 2015-02-17
        • 2011-02-25
        • 2016-03-01
        • 2013-07-23
        • 2021-10-21
        • 2013-02-24
        • 2012-04-16
        • 1970-01-01
        • 2020-02-25
        相关资源
        最近更新 更多