[英]Getting error: Peer authentication failed for user “postgres”, when trying to get pgsql working with rails
[英]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 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
。
这些是根据官方 PostgreSQL 文档关于身份验证方法的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
并更改文件底部的这一行,它应该是设置的第一行:
本地所有 postgres 同行
至
本地所有 postgres 信任
旁注:如果您还希望能够与其他用户建立联系,您还需要更改:
本地所有所有对等
至
本地所有所有 md5
如果您使用 nano 编辑器,请使用 double 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
从
本地所有 postgres 信任
至
本地所有 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
的新密码。
身份验证方法详细信息:
信任 - 任何可以连接到服务器的人都有权访问数据库
peer - 使用客户端的操作系统用户名作为数据库用户名来访问它。
md5 - 基于密码的身份验证
如需进一步参考,请在此处查看
如果您通过 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
享受!
这对我有用!
sudo -u postgres psql
sudo psql --host=localhost --dbname=database-name --username=postgres
这解决了我的问题
就我而言:
$> sudo nano /etc/postgresql/9.3/main/pg_hba.conf
所以这将改为:
通过 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 服务 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 重新启动后它不起作用,则关闭终端并再次打开。
最简单的解决方案,无需更改配置。 (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
然后进行更改。
我正在克隆服务器上移动数据目录,并且无法以 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 的文档,
对等身份验证
对等身份验证方法通过从内核获取客户端的操作系统用户名并将其用作允许的数据库用户名(带有可选的用户名映射)来工作。 此方法仅在本地连接上受支持。
在连接中使用host=localhost
。
PGconn *conn = PQconnectdb(
"host=localhost user=postgres dbname=postgres password=123"
);
在 pg_hba.conf (/etc/postgresql/9.1/main/pg_hba.conf | 第 85 行)中将 METHOD对等点更改为信任可以解决问题。 添加 md5 要求输入密码,因此如果需要避免使用密码,请使用trust而不是md5 。
以下命令对我有用:
psql -d myDb -U username -W
您只需将 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 在其主目录中为其创建了 datadir 的手动编译源 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:错误:致命:用户“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
此外,如果您无法从 postgres 帐户访问脚本,您可以使用以下方法。
$ cat ./init-user-db.sh | sudo -i -u postgres bash
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.