提问人:orderof1 提问时间:9/7/2013 最后编辑:Joel Ellisorderof1 更新时间:7/30/2023 访问量:1143472
出现错误:尝试让 pgsql 与 rails 一起工作时,用户“postgres”的对等身份验证失败
Getting error: Peer authentication failed for user "postgres", when trying to get pgsql working with rails
问:
我收到错误:
FATAL: Peer authentication failed for user "postgres"
当我尝试使 postgres 与 Rails 一起使用时。
这是我的 pg_hba.conf
、我的database.yml
和完整跟踪的转储。
我在 pg_hba 年将身份验证更改为 md5 并尝试了不同的东西,但似乎都不起作用。
我还尝试按照 Rails 3.2 创建一个新用户和数据库,致命:用户的对等身份验证失败 (PG::Error)
但是它们不会出现在 pgadmin 上,甚至在我运行时也不会出现。sudo -u postgres psql -l
知道我哪里出错了吗?
答:
问题仍然出在您的文件*上。pg_hba.conf
这一行:
local all postgres peer
应该是:
local all postgres md5
更改此文件后,不要忘记重新启动 PostgreSQL 服务器。如果您使用的是 Linux,那将是(在较旧的系统上:)。sudo systemctl restart postgresql
sudo service postgresql restart
定位hba.conf
请注意,此文件的位置不是很一致。
您可以使用或要求 PostgreSQL 来发现文件位置。locate pg_hba.conf
SHOW hba_file;
通常的位置是 和 。/etc/postgresql/[version]/main/pg_hba.conf
/var/lib/pgsql/data/pg_hba.conf
这些是根据官方 PostgreSQL 文档中关于身份验证方法的 vs 选项的简要说明。peer
md5
对等身份验证
对等身份验证方法的工作原理是获取客户端的 操作系统用户名,并将其用作允许的 数据库用户名(具有可选的用户名映射)。此方法是 仅在本地连接上受支持。
密码身份验证
基于密码的身份验证方法是 md5 和 password。这些 方法的操作方式与密码发送方式类似 跨连接,分别是 MD5 哈希和明文。
如果您完全担心密码“嗅探”攻击,那么 md5 是首选。如果可能,应始终避免使用普通密码。 但是,md5 不能与 db_user_namespace 功能一起使用。如果 连接受SSL加密保护,然后可以使用密码 安全(尽管SSL证书身份验证可能是更好的选择 如果依赖于使用 SSL)。
评论
/etc/init.d/postgresql reload
/etc/postgresql/9.1/main/pg_hba.conf
sudo service postgreql restart
我有同样的问题。
depa 的解决方案是绝对正确的。
只需确保您已将用户配置为使用 PostgreSQL。
检查文件:
$ ls /etc/postgresql/9.1/main/pg_hba.conf -l
此文件的权限应授予已向其注册 psql 的用户。
进一步。如果你到现在还好..
按照@depa的指示进行更新。
即
$ 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
安装Postgresql后,我执行了以下步骤。
打开文件 。对于 Ubuntu,例如使用并更改文件底部的这一行,它应该是设置的第一行:
pg_hba.conf
/etc/postgresql/13/main$ sudo nano pg_hba.conf
local all postgres peer
自
local all postgres trust
旁注:如果您也希望能够与其他用户联系,您还需要更改:
local all all peer
自
local all all md5
如果您使用了 nano 编辑器,请使用双 , , 退出以保存配置文件。
Escape
x
y
Enter
重新启动服务器
$ sudo service postgresql restart
输出:
* Restarting PostgreSQL 13 database server
登录 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
使用 postgres 用户登录 psql
重新启动 postgresql 服务器后,postgres 用户接受您选择的密码:
psql -U postgres
输出:
Password for user postgres:
psql (13.4 (Ubuntu 13.4-1.pgdg20.04+1))
Type "help" for help.
你在psql中:
postgres=#
旁注:如果您添加了用户和密码,现在也同样适用:
my_user
psql -d YOUR_DB_NAME -U my_user
这将要求您输入新密码。
my_user
身份验证方法详细信息:
信任 - 任何可以连接到服务器的人都有权访问数据库
对等 - 使用客户端的操作系统用户名作为数据库用户名来访问它。
MD5 - 基于密码的身份验证
如需进一步参考,请在此处查看
评论
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
以下命令对我有用:
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.
如果您有问题,您需要找到您的 .命令为:pg_hba.conf
find / -name 'pg_hba.conf' 2>/dev/null
然后更改配置文件:
Postgresql 9.3的
Postgresql 9.4的
下一步是:重新启动数据库实例:
service postgresql-9.3 restart
如果您有任何问题,您需要重新设置密码:
ALTER USER db_user with password 'db_password';
评论
我正在克隆的服务器上移动数据目录,并且无法以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=#
上面的编辑对我有用,在我发现我需要在进行编辑后重新启动 postgres 服务器之后。 对于 ubuntu:
sudo /etc/init.d/postgresql restart
- 转到此 /etc/postgresql/9.x/main/ 并打开 pg_hba.conf 文件
就我而言:
$> sudo nano /etc/postgresql/9.3/main/pg_hba.conf
- 将 peer 替换为 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 server:
$> sudo 服务 postgresql 重启
以下是用于连接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重新启动后它不起作用,则关闭终端并再次打开。
您只需将 METHOD 设置为信任即可。
#TYPE DATABASE USER ADDRESS METHOD
local all all trust
并重新加载postgres服务器。
# service postgresql-9.5 reload
pg_hba.conf 中的更改不需要 RESTART postgres 服务器。只需重新加载。
连接使用。host=localhost
PGconn *conn = PQconnectdb(
"host=localhost user=postgres dbname=postgres password=123"
);
如果要保留默认配置,但希望对一个特定的用户/数据库连接使用套接字连接进行 md5 身份验证,请在“local all/all”行之前添加一个“local”行:
# 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
评论
在 pg_hba.conf 中将 METHOD peer 更改为信任(/etc/postgresql/9.1/main/pg_hba.conf | 第 85 行)可以解决此问题。添加 md5 会要求输入密码,因此,如果需要避免使用密码,请使用 trust 而不是 md5。
许多其他答案都与各种配置文件中的设置有关,而与 确实相关的答案适用并且是 100% 正确的。但是,请确保您正在修改正确的配置文件。pg_hba.conf
正如其他人所提到的,配置文件位置可以被主配置文件中的各种设置覆盖,也可以在命令行上提供主配置文件的路径。-D
您可以在 psql 会话中使用以下命令来显示读取配置文件的位置(假设您可以启动 psql)。这只是一个故障排除步骤,可以帮助某些人:
select * from pg_settings where setting~'pgsql';
您还应该确保 postgres 用户的主目录位于您期望的位置。我之所以这样说,是因为很容易忽略这一点,因为您的提示将显示“”而不是主目录的实际路径,因此它并不那么明显。许多安装默认 postgres 用户主目录为 。~
/var/lib/pgsql
如果未设置为应有状态,请停止 postgresql 服务,并在以 root 身份登录时使用以下命令。还要确保 postgres 用户未登录到另一个会话:
usermod -d /path/pgsql postgres
最后,通过键入 来确保正确设置了 PGDATA 变量,这应该输出类似于以下内容的内容:echo $PGDATA
/path/pgsql/data
如果未设置,或显示的内容与预期不同,请检查您的启动或 RC 文件,例如 .profile 或 .bash.rc - 这将因您的操作系统和 shell 而有很大差异。确定计算机的正确启动脚本后,可以插入以下内容:
export PGDATA=/path/pgsql/data
对于我的系统,我把它放在里面,以便所有用户都可以访问它。/etc/profile.d/profile.local.sh
您现在应该能够像往常一样初始化数据库,并且您的所有 psql 路径设置都应该是正确的!
这对我有用!
sudo -u postgres psql
评论
我的问题是我没有键入任何服务器。由于占位符,我认为这是默认的,但是当我键入localhost时,它确实起作用了。
如果您尝试在 Cloud 9 中找到此文件,您可以执行以下操作
sudo vim /var/lib/pgsql9/data/pg_hba.conf
按下可编辑/插入,按 3 次并键入将保存文件并退出I
ESC
: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
sudo psql --host=localhost --dbname=database-name --username=postgres
这解决了我的问题
评论
pg_config用于提供编译信息,以帮助扩展和客户端程序编译和链接到 PostgreSQL。它对计算机上的活动 PostgreSQL 实例一无所知,只知道二进制文件。
pg_hba.conf 可以出现在许多其他地方,具体取决于 Pg 的安装方式。标准位置是数据库data_directory内的 pg_hba.conf(可以在 /home、/var/lib/pgsql、/var/lib/postgresql/[version]/、/opt/postgres/ 等等中),但用户和打包者可以将其放在他们喜欢的任何位置。不幸。
查找 pg_hba.conf 的唯一有效方法是询问正在运行的 PostgreSQL 实例 pg_hba.conf 在哪里,或者询问系统管理员它在哪里。你甚至不能依赖询问 datadir 在哪里并解析 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 系统,它会变得更容易一些。您不必处理手动编译的源码 Pg,某人在其主目录中初始化了 datadir,或者在 /opt 中安装了 EnterpriseDB Pg 等。您可以询问 Debian/Ubuntu 多版本 Pg 管理器 pg_wrapper,其中 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。
最简单的解决方案,无需更改配置。(Ubuntu的) 更改用户,然后连接到数据库 cli。
sudo -i -u postgres
psql
取自 https://www.digitalocean.com/community/tutorials/how-to-install-and-use-postgresql-on-ubuntu-18-04
请按照以下步骤操作
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_hba.conf
对于不想编辑配置文件的你,基本上只需要登录用户即可。如果您使用的是 Linux 服务器,请使用以下命令postgres
sudo -i -u postgres
它将创建用户,然后登录到它。现在再次尝试 psql 命令。postgres
您还可以使用以下命令为用户添加密码:(您应该是 root 用户)postgres
passwd postgres
这是有效的,因为根据这个PostgreSQL的文档,
对等身份验证
对等身份验证方法的工作原理是获取客户端的 操作系统用户名,并将其用作允许的 数据库用户名(具有可选的用户名映射)。此方法是 仅在本地连接上受支持。
评论
在 CentOS 7 PG 10 上,文件路径为
/var/lib/pgsql/10/data/pg_hba.conf
就我而言,我什至无法编辑或查看pg_hba.conf文件的内容。
有效的是:
/etc/postgresql/14/main$ sudo vi pg_hba.conf
具有 sudo 权限的 Vi 编辑器。
当您未提供主机时,可能会发生此错误。以下方案与此类似。
user@homepc:~$ psql -d test_db -U test_user psql:错误:致命:用户“test_user”
的对等身份验证失败 user@homepc:~$
psql -h localhost -d test_db -U test_user
用户test_user的密码:
提供主机解决了我在psql命令行中的问题。尝试在 rails 中的 postgress 的连接配置中提供主机。
这个错误对我产生了误导。我在带有挂载端口的 docker 中运行 pg。
添加到 psql 命令解决了该问题。-h <HostIp> -p <HostPort>
psql -U <User> -d <DB> -W -h <HostIp> -p <HostPort>
评论
您无需编辑任何内容,只需使用以下命令:
$psql -U postgres -h 127.0.0.1 -d [your_db]
干杯
评论
localhost
127.0.0.1
host: localhost
database.yml
--host=localhost