我收到错误:
FATAL: Peer authentication failed for user "postgres"
当我尝试让 postgres 与 Rails 一起工作时。
这是我的 pg_hba.conf
、我的 database.yml
和一个 dump of the full trace。
我在 pg_hba 中将身份验证更改为 md5 并尝试了不同的方法,但似乎都没有。
我还尝试按照 Rails 3.2, FATAL: Peer authentication failed for user (PG::Error) 创建一个新用户和数据库
但它们不会出现在 pgadmin 上,甚至在我运行 sudo -u postgres psql -l
时也不会出现。
知道我哪里出错了吗?
database.yml
文件中添加 host: localhost
。
问题仍然是您的 pg_hba.conf
文件*。
这一行:
local all postgres peer
应该:
local all postgres md5
更改此文件后,不要忘记重新启动 PostgreSQL 服务器。如果您使用的是 Linux,那就是 sudo service postgresql restart
。
定位 hba.conf
请注意,此文件的位置不是很一致。
您可以使用 locate pg_hba.conf
或要求 PostgreSQL SHOW hba_file;
发现文件位置。
通常的位置是 /etc/postgresql/[version]/main/pg_hba.conf
和 /var/lib/pgsql/data/pg_hba.conf
。
这些是根据 official PostgreSQL docs on authentication methods 对 peer
与 md5
选项的简要说明。
对等身份验证
对等身份验证方法通过从内核获取客户端的操作系统用户名并将其用作允许的数据库用户名(带有可选的用户名映射)来工作。此方法仅在本地连接上受支持。
密码认证
基于密码的身份验证方法是 md5 和密码。除了通过连接发送密码的方式(即分别为 MD5 散列和明文)之外,这些方法的操作类似。如果您完全担心密码“嗅探”攻击,那么首选 md5。如果可能,应始终避免使用纯密码。但是,md5 不能与 db_user_namespace 功能一起使用。如果连接受 SSL 加密保护,则可以安全地使用密码(但如果依赖于使用 SSL,则 SSL 证书身份验证可能是更好的选择)。
安装 Postgresql 后,我执行了以下步骤。
打开文件 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 如果您使用 nano 编辑器,请使用双 Escape 退出,x,y,Enter 保存配置文件。重新启动服务器 $ sudo service postgresql restart 输出: * 重新启动 PostgreSQL 13 数据库服务器 登录到 psql 并设置您的密码 $ psql -U postgres db> ALTER USER postgres with password 'your-pass';输出:ALTER ROLE 旁注:如果您有其他用户,他们也需要密码:db> ALTER USER my_user with password 'your-pass';然后输入: exit 最后将 pg_hba.conf 从 local all postgres trust 改为 local all postgres md5 再次重启服务器 $ sudo service postgresql restart 输出: * Restarting PostgreSQL 13 database server Login at psql with postgres user 重启 postgresql 服务器后, postgres 用户接受您选择的密码:psql -U postgres 输出:用户 postgres 的密码:psql (13.4 (Ubuntu 13.4-1.pgdg20.04+1)) 键入“help”以获得帮助。你在 psql 中: postgres=# 旁注:如果你添加了用户和密码,现在同样适用于 my_user: psql -d YOUR_DB_NAME -U my_user 这将询问你 my_user 的新密码。
身份验证方法详细信息:
信任 - 任何可以连接到服务器的人都有权访问数据库
peer - 使用客户端的操作系统用户名作为数据库用户名来访问它。
md5 - 基于密码的身份验证
供进一步参考check here
sudo passwd postgres
如果您通过 localhost (127.0.0.1) 连接,则不会遇到该特定问题。我不会对 pg_hba.conf 感到厌烦,但我会调整你的连接字符串:
psql -U someuser -h 127.0.0.1 database
其中 someuser 是您要连接的用户,而 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 someuser
Enter password for new role:
Enter it again:
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) n
postgres@www0:~$ createdb -O someuser database
postgres@www0:~$ psql -U someuser -h 127.0.0.1 database
享受!
host: 127.0.0.1
从默认更改为 localhost - 它在同一台机器上,所以我不明白为什么
这对我有用!
sudo -u postgres psql
sudo psql --host=localhost --dbname=database-name --username=postgres
这解决了我的问题
如果您有问题,您需要找到您的 pg_hba.conf
。命令是:
find / -name 'pg_hba.conf' 2>/dev/null
然后更改配置文件:
PostgreSQL 9.3
https://i.stack.imgur.com/S1P2N.png
PostgreSQL 9.4
https://i.stack.imgur.com/ZK6tb.png
下一步是:重新启动您的数据库实例:
service postgresql-9.3 restart
如果您有任何问题,您需要重新设置密码:
ALTER USER db_user with password 'db_password';
转到这个 /etc/postgresql/9.x/main/ 并打开 pg_hba.conf 文件
就我而言:
$> sudo nano /etc/postgresql/9.3/main/pg_hba.conf
用 md5 替换对等点
所以这将改为:
通过 Unix 域套接字本地所有 postgres 对等方进行数据库管理登录
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local 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 only
local all all md5
# IPv4 local connections:
host all all 127.0.0.1/32 md5
然后重启pg服务器:$> sudo service postgresql restart
以下是用于连接 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 重新启动后它不起作用,则关闭终端并再次打开。
最简单的解决方案,无需更改配置。 (ubuntu) 更改用户,然后连接到数据库 cli。
sudo -i -u postgres
psql
取自 https://www.digitalocean.com/community/tutorials/how-to-install-and-use-postgresql-on-ubuntu-18-04
我有同样的问题。
depa 的解决方案是绝对正确的。
只需确保您已将用户配置为使用 PostgreSQL。
检查文件:
$ ls /etc/postgresql/9.1/main/pg_hba.conf -l
此文件的权限应授予您注册 psql 的用户。
更远。如果你现在还好..
按照@depa 的说明进行更新。
IE
$ sudo nano /etc/postgresql/9.1/main/pg_hba.conf
然后进行更改。
-rw-r----- 1 postgres postgres 4640 Jun 16 09:59 /etc/postgresql/9.5/main/pg_hba.conf
我正在克隆服务器上移动数据目录,并且无法以 postgres 身份登录。像这样重置 postgres 密码对我有用。
root# su postgres
postgres$ psql -U postgres
psql (9.3.6)
Type "help" for help.
postgres=#\password
Enter new password:
Enter it again:
postgres=#
如果您想保留默认配置,但希望通过套接字连接对一个特定用户/数据库连接进行 md5 身份验证,请在“本地全部/全部”行之前添加“本地”行:
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local dbname username md5 # <-- this line
local all all peer
# IPv4 local connections:
host all all 127.0.0.1/32 ident
# IPv6 local connections:
host all all ::1/128 ident
上面的编辑对我有用,在我发现我需要在制作后重新启动 postgres 服务器之后。对于 ubuntu:
sudo /etc/init.d/postgresql restart
大多数解决方案都建议编辑 pg_hba.conf
。
对于不想编辑配置文件的你,基本上只需要登录postgres
用户即可。如果您在 Linux 服务器中使用 /,请使用此命令
sudo -i -u postgres
它将创建用户 postgres
,然后登录。现在再次尝试您的 psql 命令。
您还可以使用以下命令为 postgres
用户添加密码:(您应该是 root 用户)
passwd postgres
这是有效的,因为根据这个 PostgreSQL's Documentation,
对等身份验证
对等身份验证方法通过从内核获取客户端的操作系统用户名并将其用作允许的数据库用户名(带有可选的用户名映射)来工作。此方法仅在本地连接上受支持。
在 pg_hba.conf (/etc/postgresql/9.1/main/pg_hba.conf | 第 85 行)中将 METHOD 对等点更改为信任可以解决问题。添加 md5 要求输入密码,因此如果需要避免使用密码,请使用 trust 而不是 md5。
在连接中使用 host=localhost
。
PGconn *conn = PQconnectdb(
"host=localhost user=postgres dbname=postgres password=123"
);
以下命令对我有用:
psql -d myDb -U username -W
-W --password Force psql to prompt for a password before connecting to a database. This option is never essential, since psql will automatically prompt for a password if the server demands password authentication. However, psql will waste a connection attempt finding out that the server wants a password. In some cases it is worth typing -W to avoid the extra connection attempt.
您只需将 METHOD 设置为信任。
#TYPE DATABASE USER ADDRESS METHOD
local all all trust
并重新加载 postgres 服务器。
# service postgresql-9.5 reload
pg_hba.conf 中的更改不需要重新启动 postgres 服务器。只需重新加载。
请按照以下步骤
1)。首先,导航到 /etc/postgresql/{your pg version}/main 目录。
我的版本是 10 然后:
cd /etc/postgresql/10/main
2)。这里驻留 pg_hba.conf 文件需要在此处进行一些更改,您可能需要 sudo 访问权限。
sudo nano pg_hba.conf
3)。向下滚动文件,直到找到这个 -
# Database administrative login by Unix domain socket
local all postgres peer
4)。这里把peer改成md5如下。
# Database administrative login by Unix domain socket
local all all md5
peer 意味着它将信任 UNIX 用户的真实性,因此不会
提示输入密码。 md5 表示它将始终要求输入密码,并在使用 MD5 散列后对其进行验证。
5).现在保存文件并重新启动 Postgres 服务器。
sudo service postgresql restart
现在应该没问题了。
pg_config 用于编译信息,以帮助扩展和客户端程序编译和链接到 PostgreSQL。它对机器上的活动 PostgreSQL 实例一无所知,只知道二进制文件。
根据 Pg 的安装方式,pg_hba.conf 可以出现在许多其他地方。标准位置是数据库的 data_directory 中的 pg_hba.conf(可能在 /home、/var/lib/pgsql、/var/lib/postgresql/[version]/、/opt/postgres/ 等)但是用户和打包者可以把它放在他们喜欢的任何地方。很遗憾。
找到 pg_hba.conf 的唯一有效方法是询问正在运行的 PostgreSQL 实例它的 pg_hba.conf 在哪里,或者询问系统管理员它在哪里。你甚至不能依赖于询问数据目录在哪里并解析 postgresql.conf,因为在启动 Pg 时,初始化脚本可能会传递一个类似 -c hba_file=/some/other/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 中安装 EnterpriseDB Pg 等。您可以询问 pg_wrapper,Debian/Ubuntu multi -version Pg 管理器,其中 PostgreSQL 使用来自 pg_wrapper 的 pg_lsclusters 命令。
如果你不能连接(Pg 没有运行,或者你需要编辑 pg_hba.conf 来连接)你必须在系统中搜索 pg_hba.conf 文件。在 Mac 和 Linux 上,类似 sudo find / -type f -name pg_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
许多其他答案与各种配置文件中的设置有关,而与 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 文件,例如 .profile 或 .bash.rc - 这将根据您的操作系统和 shell 有很大差异。一旦你为你的机器确定了正确的启动脚本,你可以插入以下内容:
export PGDATA=/path/pgsql/data
对于我的系统,我将它放在 /etc/profile.d/profile.local.sh
中,以便所有用户都可以访问它。
您现在应该能够像往常一样初始化数据库,并且所有 psql 路径设置都应该正确!
当您不提供主机时,可能会出现此错误。下面的场景类似于它。
user@homepc:~$ psql -d test_db -U test_user psql: error: FATAL: Peer authentication failed for user "test_user" user@homepc:~$ psql -h localhost -d test_db -U test_user 用户 test_user 的密码:
提供主机解决了我在 psql 命令行中的问题。尝试在连接配置中为 rails 中的 postgress 提供主机。
我的问题是我没有输入任何服务器。由于占位符,我认为这是默认设置,但是当我输入 localhost 时它确实有效。
如果您尝试在 Cloud 9 中找到此文件,您可以执行
sudo vim /var/lib/pgsql9/data/pg_hba.conf
按 I
编辑/插入,按 ESC
3 次并输入 :wq
将保存文件并退出
如果您在使用 rails 时遇到此问题,并且知道您已经创建了带有密码和正确权限的用户名,那么您只需在 database.yml 文件的末尾添加以下内容。
host: localhost
整个文件如下所示
development:
adapter: postgresql
encoding: unicode
database: myapp_development
pool: 5
username: root
password: admin
host: localhost
您根本不需要触摸您的 pg_hba.conf
文件。快乐编码
就我而言,我什至无法编辑或查看 pg_hba.conf 文件的内容。
起作用的是:
/etc/postgresql/14/main$ sudo vi pg_hba.conf
具有 sudo 权限的 vi 编辑器。
在 CentOS 7、PG 10 上,文件路径为
/var/lib/pgsql/10/data/pg_hba.conf
/etc/init.d/postgresql reload
后,您需要重新加载您的 postgresql 服务/etc/postgresql/9.1/main/pg_hba.conf
sudo service postgreql restart
也可以。