我已经在我的 Ubuntu Karmic 机器上安装了 PostgreSQL 和 pgAdminIII。
我能够成功使用 pgAdminIII(即连接/登录),但是当我尝试在命令行上使用相同的用户名/密码登录服务器时(使用 psql),我收到错误:
psql: FATAL: Ident authentication failed for user "postgres"
有谁现在如何解决这个问题?
以下步骤适用于在 Ubuntu 12.04 上全新安装 postgres 9.1。 (也适用于 Ubuntu 14.04 上的 postgres 9.3.9。)
默认情况下,postgres 创建一个名为“postgres”的用户。我们以她的身份登录,并给她一个密码。
$ sudo -u postgres psql
\password
Enter password: ...
...
通过键入 \q
或 ctrl+d
注销 psql
。然后我们连接为“postgres”。 -h localhost
部分很重要:它告诉 psql
客户端我们希望使用 TCP 连接(配置为使用密码身份验证)进行连接,而不是通过 PEER 连接(确实不在乎密码)。
$ psql -U postgres -h localhost
您是否在 pg_hba.conf 中设置了正确的设置?
请参阅https://ubuntu.com/server/docs/databases-postgresql如何操作。
编辑文件 /etc/postgresql/8.4/main/pg_hba.conf
并将 ident
或 peer
替换为 md5
或 trust
,具体取决于您是否希望它在您自己的计算机上要求输入密码。然后重新加载配置文件:
/etc/init.d/postgresql reload
restart
对我有用,而不是 reload
--- 更改为 /etc/postgresql/9.5/main/pg_hba.conf
(将 peer
更改为 trust
)。
您收到此错误是因为您未通过客户端身份验证。根据错误消息,您可能拥有默认的 postgres 配置,它将所有 PostgreSQL 连接的客户端身份验证方法设置为“IDENT”。
您绝对应该阅读 PostgreSQL manual 中的第 19.1 Client Authentication 部分,以更好地了解可用的身份验证设置(针对 pg_hba.conf 中的每条记录),但这里有相关的代码段可帮助您解决遇到的问题(来自 {4 }):
trust 无条件允许连接。此方法允许任何可以连接到 PostgreSQL 数据库服务器的人以他们希望的任何 PostgreSQL 用户身份登录,而无需密码或任何其他身份验证。有关详细信息,请参阅第 19.3.1 节。 reject 无条件拒绝连接。这对于从组中“过滤掉”某些主机很有用,例如,拒绝行可以阻止特定主机连接,而后面的行允许特定网络中的其余主机连接。 md5 要求客户端提供双 MD5 哈希密码进行身份验证。有关详细信息,请参阅第 19.3.2 节。密码 要求客户端提供未加密的密码进行身份验证。由于密码是通过网络以明文形式发送的,因此不应在不受信任的网络上使用。有关详细信息,请参阅第 19.3.2 节。 gss 使用 GSSAPI 对用户进行身份验证。这仅适用于 TCP/IP 连接。有关详细信息,请参阅第 19.3.3 节。 sspi 使用 SSPI 对用户进行身份验证。这仅在 Windows 上可用。有关详细信息,请参阅第 19.3.4 节。 ident 通过联系客户端上的 ident 服务器获取客户端的操作系统用户名,并检查是否与请求的数据库用户名匹配。 Ident 身份验证只能用于 TCP/IP 连接。当为本地连接指定时,将使用对等身份验证。有关详细信息,请参阅第 19.3.5 节。 peer 从操作系统获取客户端的操作系统用户名,检查是否匹配请求的数据库用户名。这仅适用于本地连接。有关详细信息,请参阅第 19.3.6 节。 ldap 使用 LDAP 服务器进行身份验证。有关详细信息,请参阅第 19.3.7 节。 radius 使用 RADIUS 服务器进行身份验证。有关详细信息,请参阅第 19.3.8 节。 cert 使用 SSL 客户端证书进行身份验证。有关详细信息,请参阅第 19.3.9 节。 pam 使用操作系统提供的 Pluggable Authentication Modules (PAM) 服务进行身份验证。有关详细信息,请参阅第 19.3.10 节。
所以...要解决您遇到的问题,您可以执行以下操作之一:
将您在 pg_hba.conf 文件中定义的身份验证方法更改为您在其中定义的本地连接记录的信任、md5 或密码(取决于您的安全性和简单性需求)。更新 pg_ident.conf 以将您的操作系统用户映射到 PostgreSQL 用户,并根据您的需要授予他们相应的访问权限。保留 IDENT 设置并在数据库中为您要授予访问权限的每个操作系统用户创建用户。如果用户已经通过操作系统的身份验证并登录,PostgreSQL 将不需要进一步的身份验证,并将根据在数据库中分配给该用户的任何权限(角色)授予该用户的访问权限。这是默认配置。
注意:pg_hba.conf
和 pg_ident.conf
的位置取决于操作系统。
/etc/postgresql/9.6/main/pg_hba.conf
。
只需添加 -h localhost
位即可工作
this_computer = 'http://localhost'
-h ...
选项),那么 psql
默认会尝试通过 Unix 域套接字连接,在这种情况下 psql
(或者可能是 PostgreSQL 集群本身)会查询您的操作系统为您的用户名使用对等身份验证,即确认您的用户名与您指定的 PostgreSQL 用户(角色)匹配(很可能不匹配)。当您指定主机名时,psql
将使用 TCP/IP 连接到集群。
如果上述方法都不适合您:我已经安装了很多 Postgres,但今天在 RedHat 6.5 系统(安装 Postgres 9.3)上感到困惑。 Aron 上面显示的我的典型 hba.conf 配置不起作用。原来我的系统使用的是 IPV6,而忽略了 IPV4 配置。添加行:
host all all ::1/128 password
允许我成功登录。
您可以设置环境变量 PGHOST=localhost
:
$ psql -U db_user db_name
psql: FATAL: Peer authentication failed for user "db_user"
$ export PGHOST=localhost
$ psql -U db_user db_name
Password for user mfonline:
嗯...
如果您可以使用 pgAdminIII 中的用户名和密码进行连接,但无法使用 psql
进行连接,那么这两个程序可能以不同的方式连接到数据库。
[如果您要连接到不同的数据库,请先尝试连接到同一个数据库。见下文。]
从 PostgreSQL: Documentation: 9.3: psql:
如果省略主机名,psql 将通过 Unix 域套接字连接到本地主机上的服务器,或通过 TCP/IP 连接到没有 Unix 域套接字的机器上的 localhost。
如果您没有运行 psql ... -h host_name ...
之类的东西,而您运行的是 Ubuntu,则 psql
应该通过 Unix 域套接字连接,因此 PostgreSQL 可能未配置为允许 < em>postgres 用户。
您可以通过运行来测试它:
sudo -u postgres psql
如果上述方法有效,您的服务器可能已配置为使用对等身份验证来进行 postgres 用户的本地连接,即向操作系统询问您的用户名以确认您是 postgres。
所以它可能是你的 pg_hba.conf 文件
文件的完整路径类似于 /etc/postgresql/9.3/main/pg_hba.conf。您可以通过例如 sudo cat /etc/postgresql/9.3/main/pg_hba.conf | more
查看它。
如果您在 psql
命令中省略了主机名,那么将以下条目添加到 pg_hba.conf 文件中应该能够连接:
# Connection type Database User IP addresses Method
local all postgres md5
[pg_hba.conf 文件中的注释行以 #
开头。]
如果您正在在 psql
命令中包含主机名,请改为添加以下条目:
# Connection type Database User IP addresses Method
host all postgres 127.0.0.1/32 md5
您需要先输入该条目,然后才能通过 psql
为您的连接匹配任何其他条目。如果对放置位置有疑问,只需将其放在第一个未注释行之前。
更多关于 pg_hba.conf
来自 PostgreSQL: Documentation: 9.3: The pg_hba.conf File [我的粗体强调]:
具有匹配连接类型、客户端地址、请求的数据库和用户名的第一条记录用于执行身份验证。没有“fall-through”或“backup”:如果选择了一条记录并且认证失败,则不考虑后续记录。如果没有记录匹配,则拒绝访问。
请注意,身份验证方法上的记录不匹配。因此,如果您的 pg_hba.conf 文件包含以下条目:
# Connection type Database User IP addresses Method
local all postgres peer
然后您将无法通过以下方式连接:
psql -u postgres
除非这些条目之一位于前一个条目上方的 pg_hba.conf 文件中:
# Connection type Database User IP addresses Method
local all postgres md5
local all postgres password # Unencrypted!
local all all md5
local all all password # Unencrypted!
在以上所有答案中,对我没有任何帮助。我不得不手动更改数据库中的用户密码,它突然起作用了。
psql -U postgres -d postgres -c "alter user produser with password 'produser';"
我使用了以下设置:
pg_hba.conf
local all all peer
# IPv4 local connections:
host all all 127.0.0.1/32 password
# IPv6 local connections:
host all all ::1/128 password
最终连接成功,如下命令:
psql -U produser -d dbname -h localhost -W
对于 fedora26 和 postgres9.6
首先,以root用户登录,然后通过以下命令进入psql
$ su postgres
然后
$ psql
在 psql
中找到 hba_file ==> 的位置表示pg_hba.conf
postgres=# show hba_file ;
hba_file
--------------------------------------
/etc/postgresql/9.6/main/pg_hba.conf
(1 row)
在文件 pg_hba.conf
中更改用户对此的访问权限
host all all 127.0.0.1/32 md5
就我而言,这里的解决方案:(对于有关人员)登录到 postgres:
sudo -i -u postgres
psql
ALTER USER postgres WITH PASSWORD 'postgres'; # type your password here
问候
我发现我必须安装一个身份服务器,它侦听端口 113。
sudo apt-get install pidentd
sudo service postgresql restart
然后 ident 工作。
问题仍然是您的 pg_hba.conf 文件。这一行:你可以在 /etc/postgres/varion/main 中找到这个文件
local all postgres peer
Should be
local all postgres md5
这些是根据官方 PostgreSQL 文档关于身份验证方法的两个选项的简要描述。
对等身份验证
对等身份验证方法通过从内核获取客户端的操作系统用户名并将其用作允许的数据库用户名(带有可选的用户名映射)来工作。此方法仅在本地连接上受支持。
密码认证
基于密码的身份验证方法是 md5 和密码。除了通过连接发送密码的方式(即分别为 MD5 散列和明文)之外,这些方法的操作类似。
如果您完全担心密码“嗅探”攻击,那么首选 md5。如果可能,应始终避免使用纯密码。但是,md5 不能与 db_user_namespace 功能一起使用。如果连接受 SSL 加密保护,则可以安全地使用密码(但如果依赖于使用 SSL,则 SSL 证书身份验证可能是更好的选择)。
更改此文件后,不要忘记重新启动 PostgreSQL 服务器。如果您使用的是 Linux,那将是 sudo service postgresql restart.
我在 bash shell 中的 Mac OSX 上的 PostgreSQL 9.3 上的解决方案是使用 sudo
进入数据文件夹,然后将必要的行附加到 pg_hba.conf
文件以允许所有用户受信任并能够登录.这就是我所做的:
# in bash_profile edit PGDATA environmental variable
open ~/.bash_profile
# append this line to bash_profile
export PGDATA="/Library/PostgreSQL/9.3/data"
# reload bash_profile
source ~/.bash_profile
# open pg_hba.conf in vim
sudo vi /Library/PostgreSQL/9.3/data/pg_hba.conf
# append these two lines to the end of the pg_hba.conf file
local all all trust
host all all 127.0.0.1/32 trust
# can now login as user in bash
psql -d <db_name> -U <user_name> -W
我花了更多时间来解决这个我愿意承认的错误。
我认为 pg_hba.conf 中的身份验证配置顺序与您的情况相关。默认配置文件在 vanilla 安装中包含几行。这些默认值可以匹配您的身份验证尝试的条件,从而导致身份验证失败。无论在 .conf 文件末尾添加的其他配置如何,它都会失败。
要检查使用哪一行配置,请务必查看默认日志文件中的消息。你可能会看到这样的东西
LOG: could not connect to Ident server at address "127.0.0.1", port 113: Connection refused
FATAL: Ident authentication failed for user "acme"
DETAIL: Connection matched pg_hba.conf line 82: "host all all 127.0.0.1/32 ident"
事实证明,这个默认行导致了拒绝。
host all all 127.0.0.1/32 ident
尝试将其注释掉。
我有类似的问题,我在删除所有 ident 方法时在 pg_hba.conf 中修复了它,即使是 IP6 地址(尽管我的机器上只有 IP4)。
host all all 127.0.0.1/32 password
host all all ::1/128 password
#for pgAdmin running at local network
host all all 192.168.0.0/24 md5
解决这个问题的一个技巧是编辑 pg_hba.conf
sudo vi /etc/postgresql/9.3/main/pg_hba.conf
暂时
# Database administrative login by Unix domain socket
local all postgres trust
至此,您就完成了。为了安全起见,然后去
sudo -u postgres psql template1
ALTER USER postgres with encrypted password 'your_password';
然后返回并将 pg_hba.conf 设置回
# Database administrative login by Unix domain socket
local all postgres md5
如果您在 CentOS 上使用它,您可能需要在完成上述解决方案后重新加载 postgres:
systemctl restart postgresql-9.3.service
postgresql
systemctl status | grep postgres
https://i.stack.imgur.com/6wPA8.png
CREATE USER admin WITH PASSWORD 'secret'
然后在 cmd
psql "dbname=Main_db host=127.0.0.1 user=admin password=secret port=5432
其中 dbname 是您在 postgresql 中的数据库
https://i.stack.imgur.com/mKoYq.png
它与PostgreSQL安装的配置问题有关:
在下面提到的 conf 文件中配置 # TYPE DATABASE USER ADDRESS METHOD 部分
查找并编辑 /var/lib/pgsql/10/data/pg_hba.conf 或根据您的文件位置更新方法(md5)。如果您的配置不存在,则通过如下比较更新文件中的条目:
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all trust
local all all md5
# IPv4 local connections:
host all all 127.0.0.1/32 md5
host all all 0.0.0.0/0 md5
# IPv6 local connections:
host all all ::1/128 md5
在下面提到的 conf 文件中配置 CONNECTIONS AND AUTHENTICATION 部分
查找和编辑 /var/lib/pgsql/10/data/postgresql.conf 或根据您的文件位置更新侦听地址和端口
listen_addresses = '*' // # what IP address(es) to listen on;
# comma-separated list of addresses;
# defaults to 'localhost'; use '*' for all
port = 5432 // Set port as 5432
重启你的 PostgreSQL:
sudo systemctl restart postgresql-10 # Update service name based on your installation
遵循此操作后我遇到了同样的问题:PostgreSQL setup for Rails development in Ubuntu 12.04
我尝试了其他答案,但我所要做的就是:“config/database.yml”
development:
adapter: postgresql
encoding: unicode
database: (appname)_development
pool: 5
username: (username you granted appname database priviledges to)
password:
我必须重新安装 pdAdmin 才能解决此问题
brew cask reinstall pgadmin4
我通过 terraform 在 GCP SQL 中提供了用户名和密码,问题是密码没有通过 terraform 正确设置,所以虽然不是正确的修复,但只是为了找出确切的原因。
我从 GCP 控制台更改了用户的密码并且有效。
这对我有用:http://tecadmin.net/fatal-ident-authentication-failed-for-user-postgres/#
local all postgres trust
local all myapp_usr trust
# IPv4 local connections:
host all all 127.0.0.1/32 trust
# IPv6 local connections:
#host all all ::1/128 trust
不定期副业成功案例分享
PGHOST=localhost
,则无需每次都指定-h
选项。这也适用于其他pg_*
命令,例如pg_dump
。